思路:
這題是道經典題,真的很有意思,才學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...