1 条题解

  • 0
    @ 2022-07-02 21:48:56
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ans1=INT_MIN,ans2=INT_MAX;
    int num[101],s[101],maxn[101][101][11],minn[101][101][11];
    int mod(int k)
    {
        return (k%10+10)%10;
    }
    int dfs1(int l,int r,int t)
    {
        if(maxn[l][r][t]!=-1)
            return maxn[l][r][t];
        if(t==1)
            return maxn[l][r][t]=mod(s[r]-s[l-1]);
        int ans=-1;
        for(int k=l; k<r; k++)
            for(int i=1; i<t; i++)
                ans=max(ans,dfs1(l,k,i)*dfs1(k+1,r,t-i));
        return maxn[l][r][t]=ans;
    }
    int dfs2(int l,int r,int t)
    {
        if(minn[l][r][t]!=-1)
            return minn[l][r][t];
        if(t==1)
            return minn[l][r][t]=mod(s[r]-s[l-1]);
        int ans=0x7fffffff;
        for(int k=l; k<r; k++)
            for(int i=1; i<t; i++)
                ans=min(ans,dfs2(l,k,i)*dfs2(k+1,r,t-i));
        return minn[l][r][t]=ans;
    }
    int main()
    {
        memset(maxn,-1,sizeof(maxn));
        memset(minn,-1,sizeof(minn));
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&num[i]);
            num[i+n]=num[i];
        }
        for(int i=1; i<=2*n; i++)
            s[i]=s[i-1]+num[i];
        for(int i=1; i<=n; i++)
        {
            dfs1(i,i+n-1,m);
            dfs2(i,i+n-1,m);
        }
        for(int i=1; i<=n; i++)
        {
            ans1=max(ans1,maxn[i][i+n-1][m]);
            ans2=min(ans2,minn[i][i+n-1][m]);
        }
        printf("%d\n%d",ans2,ans1);
        return 0;
    }
    
  • 1

[NOIP2003 普及组] 数字游戏

信息

ID
1239
难度
7
分类
动态规划 | 搜索 点击显示
标签
递交数
2
已通过
1
通过率
50%
上传者