JoyOI1062 合并傻子(环形DP)

xiaoxiao2021-02-28  54

题意分析

其实就是环形的式子合并

代码总览

#include<bits/stdc++.h> using namespace std; const int nmax = 255; int sum[nmax]; int a[nmax]; int dp[nmax][nmax],dp2[nmax][nmax]; int n,m; int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i = 1;i<=n;++i) scanf("%d",&a[i]); for(int i = n+1;i<=2*n;++i) a[i] = a[i-n]; for(int i = 1;i<=2*n;++i) sum[i] = sum[i-1] + a[i]; for(int len = 2;len<=n;++len){ for(int i = 1;i<=2*n-len+1;++i){ int j = i+len-1; dp[i][j] = 0; dp2[i][j] = 0x3f3f3f3f; 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]); dp2[i][j] = min(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]); } } } int mmax = 0,mmin = 0x3f3f3f3f; for(int i = 1;i<=n;++i){ mmax = max(mmax,dp[i][n+i-1]); mmin = min(mmin,dp2[i][n+i-1]); } if(m>mmax) printf("It is easy\n"); else if(m<mmin) printf("I am..Sha...X\n"); else printf("I will go to play WarIII\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2630958.html

最新回复(0)