1021 石子歸併 區間DP

2021-07-25 23:43:15 字數 830 閱讀 4790

思路:

這題是道經典題,真的很有意思,才學dp學詳細點吧!

應該算上乙個區間的dp,在寫dp的時候我覺得不僅僅只想狀態轉移方程,更要確定i j dp i j 等各個狀態參量的實際意義,否則dp方程是無法確定的。一開始想的是按照數塔階段性轉移,i表示第幾次合併,j表示合併第幾個,但是並不行。

實際解題步驟:

確定i,j開始區間dp, 表示從i石子到j石子合併需要的最小代價。之後開始把大問題分解為 1~2合併最小代價 2~3合併最小代價,1~3合併最小代價等等。

轉移方程就可以確定為

dp[i][i+step]=min(dp[i][i+step],dp[i][i+k]+dp[i+k+1][i+step]+sum[i+k]-sum[i-1]+sum[i+step]-sum[i+k] );
三個參量step向右合併多少個石子,i從第幾個開始合併。sum表示合併的時候按題目要求的權值和

#include
#include#include #include #include#include using namespace std;

const int inf=0x3f3f3f3f;

int dp[1005][1005];

int sum[1005];

int a[1005];

int main()

int n;

cin>>n;

for(int i=1;i<=n;i++)

for(int step=1;step}

}cout

}

1021 石子歸併 區間dp

1021 石子歸併 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少...

1021 石子歸併 dp

n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少合併方法 1 2 3 4 3 3 4 3 6 4 9 10 19 1 2 3 4 1 5 4 5 1 9...

51nod1021石子歸併(區間dp)

include include include using namespace std int n int a 105 sum 105 int dp 105 105 const int inf 0x3f3f3f3f void init int main for int len 2 len n len...