poj1651 矩陣鏈乘

2021-06-28 17:39:27 字數 1131 閱讀 7524

以矩陣鏈abcd為例

按照矩陣鏈長度遞增計算最優值

矩陣鏈長度為1時,分別計算出矩陣鏈a、b、c、d的最優值

矩陣鏈長度為2時,分別計算出矩陣鏈ab、bc、cd的最優值

矩陣鏈長度為3時,分別計算出矩陣鏈abc、bcd的最優值

矩陣鏈長度為4時,計算出矩陣鏈abcd的最優值

動歸方程:

k為矩陣鏈斷開的位置

d陣列存放矩陣鏈計算的最優值,d[i][j]是以第i個矩陣為首,第j個矩陣為尾的矩陣鏈的最優值,i > 0

m陣列內存放矩陣鏈的行列資訊,m[i-1]和m[i]分別為第i個矩陣的行和列(i = 1、2、3...)

**實現時需要注意的問題:計算順序!!!

因為你要保證在計算m[i][j]查詢m[i][k]和m[k+1][j]的時候,m[i][k]和m[k+1][j]已經計算出來了。

觀察座標的關係如圖:

int m[size]; //存放矩陣鏈的行列資訊,m[i-1]和m[i]分別為第i個矩陣的行和列(i = 1、2、3...)

int d[size][size]; //存放矩陣鏈計算的最優值,d[i][j]為第i個矩陣到第j個矩陣的矩陣鏈的最優值,i > 0

int best_dp(int n)

} d[i][j] = min;

} }

return d[1][n-1];

} int main()

printf("%d\n", best_dp(n));

} return 0;

}

Poj1651 矩陣鏈乘

題目沒有以明顯得矩陣鏈乘的形式給出來,但是按照它的規則去做就發現是可以轉換成矩陣連乘的,注意些遞推程式的時候,長區間的值要依賴短區間的值,所以還要有區間長度的迴圈,並且每次進入新的長區間進行劃分之前,都要用短區間來更新長區間的初值 poj1651.cpp 定義控制台應用程式的入口點。include ...

poj1651解題報告

題目大意 給出一組n個數,每次從中抽出乙個數 第一和最後乙個不能抽 該次的得分即為抽出的數與相鄰兩個數的乘積。直到只剩下首尾兩個數為止。問最小得分是多少?解題思路 用dp,轉化為矩陣鏈乘問題,但要注意最後一前一尾兩個數不能算進去,所以處理起來還是好一定的差別!include include incl...

poj1651 區間DP 基礎

題意 給你一串數字,頭尾不能動,每次取出乙個數字,這個數字貢獻 該數字與左右相鄰數字的乘積,求乙個最小值。思路 用dp s t 去代表s到t的最小值,包括a s 和a t 然後從區間為3開始列舉,對每個小區間列舉乙個取出的數,狀態轉移方程就是 dp s t min dp s k dp k j a i...