- 动态规划
区间dp模板
- @ 2026-7-19 11:33:20
#include <iostream>
using namespace std;
int n,x[205],dp1[205][205],dp2[205][205],sum[205],ans1=-0x3f3f3f3f,ans2 = 0x3f3f3f3f;
// n^3 区间dp。
int main(){
cin >> n;
for(int i = 1;i <= n;i++){
cin >> x[i];
x[i+n] = x[i];
}
for(int i = 1;i <= n * 2;i++)sum[i] = sum[i-1] +x[i];
for(int l = 2;l <= n;l++){
for(int i = 1;i<=2*n-l+1;i++){
int j = i + l - 1;
// 模板,i 是左节点,j 是右节点
dp2[i][j] = 0x3f3f3f3f;
dp1[i][j] = -0x3f3f3f3f;
for(int k = i;k < j;k++){
// [i,j] 分割成两部分,先合并左边[l,k],再合并右边[k+1,j],再加上这一段的合并
dp1[i][j] = max(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
dp2[i][j] = min(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
}
}
}
for (int i=1;i<=n;i++){
ans1=max(ans1,dp1[i][i+n-1]);
ans2=min(ans2,dp2[i][i+n-1]);
}
cout << ans2 << endl << ans1;
return 0;
}
0 条评论
目前还没有评论...