poj 1179 矩陣鏈乘加括號

2021-06-28 09:20:03 字數 841 閱讀 9297

題意:多邊形遊戲,有n個頂點的多邊形,3 <= n <= 50 ,多邊形有n條邊,每個頂點中有乙個數字(可正可負),每條邊上或者是「+」號,或者是「*」號。邊從1到n編號,首先選擇一條邊移去,然後進行如下操作:1 選擇一條邊e和邊e連線著的兩個頂點v1,v2;2 用乙個新的頂點代替邊e和v1、v2,新頂點的值為v1、v2中的值進行邊上代表的操作得來(相加或相乘)。當最後只剩乙個頂點,沒有邊時,遊戲結束。現在的任務是程式設計求出最後的頂點能獲得的最大值,以及輸出取該最大值時,第一步需移去的邊,如果有多條符合條件的邊,按編號從小到大輸出。

思路:發現可以用矩陣鏈乘來做,迴圈也比較好處理,將多邊形按順序複製一次即可,求鏈乘最大長度為n即可。但是由於定點的資料可能是負數,所以最大值可能出現負負得正的情況,所以還需要儲存矩陣鏈的最小值。

#include #include #define inf 0x3fffffff

#define min(a,b) ((a)<(b)?(a):(b))

#define max(a,b) ((a)>(b)?(a):(b))

#define n 150

int n,op[n],dp[n][n][2],ans[n];//dp第三維為0表示最小值,最大表示最大值

int dd(int x)

int computemax(int i,int id,int j)

int computemin(int i,int id,int j)

int main()

for(k = 1;kres)else if(dp[i][i+n-1][1] == res)

ans[num++] = i;

}printf("%d\n",res);

for(i = 0;i

poj 1179 記憶化搜尋

注意一點 在加法的時候最大值肯定是兩個最大值相加,最小值肯定是兩個最小值相加 在乘法的時候 最大值可能是兩個最大值相乘 也可能是兩個最小值相乘,最小值可能是兩個最小值相乘,也可能是乙個最大值和乙個最小值 然後我用的是記憶化搜尋 dp min i j 表示區間i到j的最小值,dp max i j 表示...

POJ 1179 列舉 區間 DP

題意 傳送門 poj 1179 題解列舉初始時刪的邊,將環拆成鏈。觀察刪邊 縮點的過程,有明顯的區間性質,考慮用區間 dpdp dp求解。由於點權值可能出現負數,那麼在狀態轉移求最大值的過程中,要考慮負負得正的情況。d p i j 2 dp i j 2 dp i j 2 代表區間 i,j i,j i...

poj1651 矩陣鏈乘

以矩陣鏈abcd為例 按照矩陣鏈長度遞增計算最優值 矩陣鏈長度為1時,分別計算出矩陣鏈a b c d的最優值 矩陣鏈長度為2時,分別計算出矩陣鏈ab bc cd的最優值 矩陣鏈長度為3時,分別計算出矩陣鏈abc bcd的最優值 矩陣鏈長度為4時,計算出矩陣鏈abcd的最優值 動歸方程 k為矩陣鏈斷開...