石子歸併【動態規劃】
阿新 • • 發佈:2018-12-15
#include<iostream> #include<cstring> using namespace std; //狀態轉移方程:dp[i][j]=dp[i][k]+dp[k+1][j]+(w[i]+w[i+1]+...+w[j-1]+w[j]). int w[101];int n; int dp[101][101]; int pw[101];//記錄字首和 int main(){ cin>>n; memset(dp,0x3f,sizeof(dp)); pw[0]=0; for(int i=1;i<=n;i++){ cin>>w[i]; dp[i][i]=0; pw[i]=pw[i-1]; pw[i]+=w[i]; } for(int len=2;len<=n;len++){ for(int i=1;i<=n-len+1;i++){ int j=i+len-1; int minn=0x3f3f3f3f; for(int k=i;k<=j;k++){ minn=min(dp[i][k]+dp[k+1][j]+pw[j]-pw[i]+w[i],minn); } dp[i][j]=minn; } } cout<<dp[1][n]<<endl; return 0; }