【动态规划笔记】区间dp:合并果子_暮色_年华的博客 环形区间的处理: 断环为链: 输入的处理: 登录后复制 for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=n+1;i<=2*n;i++){ a[i]=a[i-n]; } 1.2.3.4.5.6. 枚举区间: 登录后复制 for(int len=2;len<=n;len++){ for(int i=1;i+len-1<=2*n;i++){ int j=i+len-1; for(int k=i;k<j;k++) dp[i][j]=dp[i][k]+dp[k+1][j]...; } } 1.2.3.4.5.6.7. 初始化: 最大dp:dp[i][j]=0; 最小dp:dp[i][j]=INF&&dp[i][i]=0 代码: 登录后复制 #include<iostream> #include<cstring> using namespace std; int a[401]; int sum[401]; int dp[401][401]; int dp1[401][401]; int n; int main(){ cin>>n; memset(dp1,0x3f,sizeof(dp1)); for(int i=1;i<=n;i++){ cin>>a[i]; sum[i]=sum[i-1]+a[i]; } for(int i=n+1;i<=2*n;i++){ a[i]=a[i-n]; sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=2*n;i++){ dp[i][i]=0; dp1[i][i]=0; } for(int len=2;len<=n;len++){ for(int i=1;i+len-1<=2*n;i++){ int j=len+i-1; for(int k=i;k<j;k++){ dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]); }} } int res1=0; int res2=0x3f3f3f3f; for(int i=1;i<=n+1;i++){ res1=max(res1,dp[i][i+n-1]); res2=min(res2,dp1[i][i+n-1]); } cout<<res2<<endl; cout<<res1<<endl; return 0; } 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42. 原创作者: u_16969274 转载于: https://blog.51cto.com/u_16969274/11820686