題目:
計算矩陣連乘積a1,a2,...,an,其中ai的維度為p[i-1]*p[i]。輸入規模n,p[0]~p[n],輸出最少乘的次數和斷點處也就是乘法順序。
思路:區間dp,m[i][j]表示從ai到aj區間內的最少乘的次數,列舉k(i用s[i][j]記錄每次最少次數的時候是在哪個地方斷開,即k的位置。詳見**。
**:#include using namespace std;
const int maxn=101;
int m[maxn][maxn],s[maxn][maxn],p[maxn];
int n;
void matrixchain()
{ for(int i=1; i<=n; i++)
m[i][i]=0;
for(int len=2; len<=n; len++)
{for(int i=1; i<=n-len+1; i++)
{int j=i+len-1;
m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1; k
input
630 35 15 5 10 20 25
830 35 15 5 10 20 25 10 30
output
15125
multiply a2,2 and a3,3
multiply a1,1 and a2,3
multiply a4,4 and a5,5
multiply a4,5 and a6,6
multiply a1,3 and a4,6
18625
multiply a2,2 and a3,3
multiply a1,1 and a2,3
multiply a4,4 and a5,5
multiply a4,5 and a6,6
multiply a4,6 and a7,7
multiply a4,7 and a8,8
multiply a1,3 and a4,8
DP 矩陣連乘
問題 給定n個矩陣,求乘法次數的最小值 1 最優子結構 乙個簡單的解決辦法是把括號放在所有可能的地方,計算每個位置的成本,並返回最小值。對於乙個長度為n的鏈,我們有n 1種方法放置第一組括號。例如,如果給定的鏈是4個矩陣。讓矩陣連為abcd,則有3種方式放第一組括號 a bcd ab cd和 abc...
矩陣連乘DP
矩陣相乘的條件 a1 a2 a1 x,y a2 y,z a3 x,z a1的列數數等於a2的行數 運算次數為x y z 對於a1,a2,an個矩陣,a1 a2 a3 a4 an 我們可以用結合律 也就是新增括號,使整個運算過程運算次數最少 演算法效率最高。維數分別為10 100 100 5 5 50...
基於DP的矩陣連乘問題
當多個連續可乘矩陣做乘法時,選擇正確的做乘順序可以有效減少做乘法的次數,而選擇的方法可以很容易的通過dp實現。原理就是對於每乙個所求矩陣,搜尋所有可以相乘得到它的方法,比較它們的消耗,選取最小值作為採用的方法。例如,給出矩陣a1 30 35 a2 35 15 a3 15 5 a4 5 10 a5 1...