记录编号 348948 评测结果 AAAAA
题目名称 [NOIP 2003]数字游戏 最终得分 100
用户昵称 GravatarZWOI_ヤシニャ 是否通过 通过
代码语言 C 运行时间 0.005 s
提交时间 2016-11-14 17:32:11 内存使用 0.30 MiB
显示代码纯文本
#include <stdio.h>  
#include <string.h>  
#define MAX 10000000  
#define MIN -10000000  
int line[200],n,m,Min,Max,sum[200];  
int f[200][20];//f[i][j]=第1-i个数分成j份,结果最大值  
int g[200][20];//g[i][j]=第1-i个数分成j份,结果最小值  
int min(int a,int b)  
{  
    if(a>b)  
        return b;  
    return a;  
}  
int max(int a,int b)  
{  
    if(a>b)  
        return a;  
    return b;  
}  
void dp(int a[])  
{  
    int i,j,k;  
    for(i=1;i<=n;i++)  
        sum[i]=sum[i-1]+a[i];  
    for(i=0;i<=n;i++)  
        for(j=0;j<=m;j++)  
        {  
            f[i][j]=0;  
            g[i][j]=-1u>>1;  
        }  
    for(i=1;i<=n;i++)  
    {  
        f[i][1]=g[i][1]=(sum[i]%10+10)%10;  
    }  
    f[0][0]=1;  
    g[0][0]=1;  
    for(j=2;j<=m;j++)  
    {  
        for(i=j;i<=n;i++)  
        {  
            for(k=j-1;k<i;k++)  
            {  
                {  
                    f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));  
                    g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));  
                }  
            }  
        }  
    }  
    Max=max(Max,f[n][m]);  
    Min=min(Min,g[n][m]);  
}  
int main()  
{  
    int i,j,k;  
	freopen("numgame.in","r",stdin);
	freopen("numgame.out","w",stdout);
    Max=0;  
    Min=-1u>>1;  
    scanf("%d%d",&n,&m);  
    for(i=1;i<=n;i++)  
    {  
        scanf("%d",&line[i]);  
        line[i+n]=line[i];  
    }  
    for(i=0;i<n;i++)  
        dp(line+i);  
    printf("%d\n%d\n",Min,Max);  
    return 0;  
}