先在小区间DP得到最优解,再合并小区间求大区间最优解,一般把左右两个相邻的子区间合并,需要从小到大枚举所有可能的区间。
http://120.78.128.11/Problem.jsp?pid=2385
码个代码,我再琢磨两下之后完善。(代码是一排石子,和上题有点区别)
#include<bits/stdc++.h> using namespace std; const int INF=1<<30; const int N=300; int sum[N],n; int Minval(){ int dp[N][N]; for(int i=1;i<=n;i++) dp[i][i]=0; for(int len=1;len<n;len++){ for(int i=1;i<=n-len;i++){ int j=i+len; dp[i][j]=INF; for(int k=i;k<j;k++) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); } } return dp[1][n]; } int main() { while(~scanf("%d",&n)){ sum[0]=0; for(int i=1;i<=n;i++){ int x; scanf("%d",&x); sum[i]=sum[i-1]+x; } printf("%d\n",Minval()); } return 0; }
原文:https://www.cnblogs.com/Untergehen/p/14342335.html