我們都知道矩陣乘法:給定兩個矩陣a和b,若a是n*r的矩陣,b是r*m的矩陣,則a*b的結果c是乙個n*m的矩陣,且c[i,j]=∑a[i,k]*b[k,j],其中1<=k<=r。很顯然,求出每個c[i,j]的過程中,我們都做了r次標量乘法。因此,總的標量乘法次數是n*m*r。
矩陣乘法滿足結合律。換句話說,即使乘的順序不同,結果都是相同的。例如,四個矩陣相乘,會有五種不同的順序:
(a1(a2(a3a4)))
(a1((a2a3)a4))
((a1a2)(a3a4))
((a1(a2a3))a4)
(((a1a2)a3)a4)
但是,不同的順序會導致不同的效率——本題中,我們希望將給定的矩陣乘起來,並且使得總的標量乘法次數最少。注意,本題中給定的矩陣可以看作是環形的——第乙個和最後乙個矩陣可以相乘!為了滿足矩陣乘法的合法性,輸入資料保證對於任意相鄰的矩陣,它們相鄰的維數一定相等。
【資料規模和約定】
n<=100
所有矩陣的行、列數都是不超過1000的正整數。
第一行乙個整數n,表示矩陣個數。
接下來n行,每行兩個整數,表示這個矩陣的行數和列數。
乙個整數,表示最少乘法次數。
f[i][j] = f[i][l]+f[l+1][j]+a[i]*b[l]*b[j]。
f[i][i+1]=a[i]*b[i]*b[i+1]
終於ac了。感覺本來不太難的題。就是乙個能量項鍊。
一定要記得賦初值,今天一開始就錯在這裡。
還有輸出的時候,一開始
for (long i=1;i寫的for (long i=1;i結果多了乙個[n,n*2+1]的無效狀態。
結果全是-oo。
值得注意的是,有乘法的區間動歸貌似都不能用四邊形不等式
#include using std::cout;
//using std::cin;
#include const long long oo = 9223372036854775807ll;
long n;
long a[212];
long b[212];
long long f[212][212];
typedef long long lld;
int main()
}} }
/* for (long i=1;inn) break;
ans <?= f[i][i+n-1];
} cout << ans;
return 0;
}
Block Voting 解題報告
這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...
Safebreaker 解題報告
又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...
路由 解題報告
路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...