求助题目P1880石子合并
  • 板块灌水区
  • 楼主四宫辉夜
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/8/7 09:49
  • 上次更新2023/10/27 16:39:44
查看原帖
求助题目P1880石子合并
335816
四宫辉夜楼主2022/8/7 09:49

代码如下:

#include<cstdio>
#include<cstring>
int n,a[201],dp1[201][201],dp2[201][201];
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
int main()
{
    scanf("%d",&n);
    for(register int i=1;i<=n;++i)
        scanf("%d",a+i),a[i+n]=a[i];
    for(register int i=1;i<=(n<<1);i?a[i++]+=a[i-2]:i++);
    for(register int t=1;t<n;++t)
        for(register int i=1,j=t+i,tmp=0x7fffffff;(i<(n<<1))&&(j<(n<<1));++i,j=t+i,tmp=0x7fffffff)
            for(register int k=i;k<j;++k)
            {
                dp2[i][j]=tmp;
                dp1[i][j]=max(dp1[i][j],dp1[i][k]+dp1[k+1][j]+a[j]-a[i-1]);
                dp2[i][j]=min(dp2[i][j],dp2[i][k]+dp2[k+1][j]+a[j]-a[i-1]);
            }
    int ans1=0,ans2=0x7fffffff;
    for(register int i=1;i<=n;++i)
    {
        ans1=max(ans1,dp1[i][i+n-1]);
        ans2=min(ans2,dp2[i][i+n-1]);
    }
    for(register int i=1;i<=n;++i)
        printf("%d %d\n",dp1[i][i+n-1],dp2[i][i+n-1]);
    printf("%d\n%d",ans2,ans1);
}

对于第2 3 4点的最小值会炸

2022/8/7 09:49
加载中...