Codevs_2102_石子归并2_(环状动态规划)
描述
http://codevs.cn/problem/2102/
2102 石子归并 2
时间限制: 10 s
空间限制: 256000 KB
题目等级 : 黄金 Gold
分析
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=100+5,INF=0x7fffffff; 5 6 int n,ans1,ans2; 7 int s[maxn<<1],dp1[maxn][maxn],dp2[maxn][maxn]; 8 9 void solve(){ 10 ans1=INF, ans2=-INF; 11 for(int q=1;q<=n;q++){ 12 for(int r=2;r<=n;r++) 13 for(int i=q;i<=q+n-r;i++){ 14 int j=i+r-1; 15 dp1[i-q+1][j-q+1]=INF; dp2[i-q+1][j-q+1]=-INF; 16 for(int k=i;k<j;k++){ 17 dp1[i-q+1][j-q+1]=min(dp1[i-q+1][j-q+1],dp1[i-q+1][k-q+1]+dp1[k+1-q+1][j-q+1]+s[j]-s[i-1]); 18 dp2[i-q+1][j-q+1]=max(dp2[i-q+1][j-q+1],dp2[i-q+1][k-q+1]+dp2[k+1-q+1][j-q+1]+s[j]-s[i-1]); 19 } 20 } 21 ans1=min(dp1[1][n],ans1); 22 ans2=max(dp2[1][n],ans2); 23 } 24 printf("%d\n%d\n",ans1,ans2); 25 } 26 void init(){ 27 scanf("%d",&n); 28 for(int i=1;i<=n;i++){ 29 int t; scanf("%d",&t); 30 s[i]=s[i-1]+t; 31 } 32 for(int i=n+1;i<=n*2;i++) s[i]=s[i-n]+s[n]; 33 } 34 int main(){ 35 init(); 36 solve(); 37 return 0; 38 }