【TYVJ】1062 合并傻子

来源:互联网 发布:sql网络接口error 26 编辑:程序博客网 时间:2024/05/01 03:07

先轮回构造,然后区间DP,本蒟蒻用记忆化搜索。

#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;const int N=100;const int MAX=1000000000;const int MIN=-MAX;int n,m,len;int p[N+N],tr[N+N];int mx[N+N][N+N],mn[N+N][N+N];int RPx=MIN,RPn=MAX;inline int read(void){    int s=0,f=1; char c=getchar();    for (;c<'0'||c>'9';c=getchar()) if (c=='-') f=-1;    for (;'0'<=c&&c<='9';c=getchar()) s=(s<<1)+(s<<3)+c-'0';    return s*f;}void init(void){    n=read(),m=read();    for (int i=1;i<=n;i++) p[i]=read();        len=n+n-1;    for (int i=n+1;i<=len;i++) p[i]=p[i-n];    for (int i=1;i<=len;i++) tr[i]=tr[i-1]+p[i];    }inline int max(int i,int j){    return i>j?i:j;}inline int min(int i,int j){    return i<j?i:j;}void dp(int i,int j){    if (mx[i][j]^MIN) return;    if (i==j) {mx[i][j]=mn[i][j]=0;return;}    for (int k=i;k<j;k++)    {        dp(i,k),dp(k+1,j);        mx[i][j]=max(mx[i][j],mx[i][k]+mx[k+1][j]+tr[j]-tr[i-1]);        mn[i][j]=min(mn[i][j],mn[i][k]+mn[k+1][j]+tr[j]-tr[i-1]);    }}void work(void){    for (int i=1;i<=len;i++)        for (int j=1;j<=len;j++)            mx[i][j]=MIN,mn[i][j]=MAX;    dp(1,len);        for (int i=1;i<=n;i++)    {        RPx=max(RPx,mx[i][i+n-1]);        RPn=min(RPn,mn[i][i+n-1]);    }    if (m>RPx)       printf("It is easy\n");    else    if (m<RPn)       printf("I am..Sha...X\n");    else printf("I will go to play WarIII\n");}int main(void){        init();    work();        return 0;}


0 0
原创粉丝点击