记录编号 246890 评测结果 AAAAA
题目名称 [NOIP 2003]数字游戏 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 0.018 s
提交时间 2016-04-07 16:08:20 内存使用 2.03 MiB
显示代码纯文本
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))

#include<cstdio>
#include<cstring>

using namespace std;

int n,m,a[120];
int MAX=-0x7fffffff,MIN=0x7fffffff;
int h[120][120];
int f[120][120][20];
int F[120][120][20];
//从i到j分为k个部分相加所得结果

void DP()
{
	for(int l=2;l<=n;l++)
	    for(int i=1;i<=2*n-l;i++){
			int j=i+l-1;
			h[i][j]=h[i][j-1]+a[j];
			F[i][j][1]=f[i][j][1]=((h[i][j]%10)+10)%10;
	    }
	for(int l=2;l<=n;l++)
	    for(int i=1;i<=2*n-l;i++){
			int j=i+l-1;
			for(int k=2;k<=(l<m ? l:m);k++){
				f[i][j][k]=6000000;
				for(int d=i+k-2;d<j;d++){
					F[i][j][k]=Max(F[i][j][k],F[i][d][k-1]*F[d+1][j][1]);
					f[i][j][k]=Min(f[i][j][k],f[i][d][k-1]*f[d+1][j][1]);
				}
			}
	    }
	for(int i=1;i<=n;i++){
		MAX=Max(MAX,F[i][i+n-1][m]);
		MIN=Min(MIN,f[i][i+n-1][m]);
	}

}
int main()
{
    freopen("numgame.in","r",stdin);
	freopen("numgame.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
	    scanf("%d",&a[i]);
	    a[n+i]=a[i];
	    h[i][i]=h[n+i][n+i]=a[i];
	    F[i][i][1]=F[n+i][n+i][1]=f[i][i][1]=f[n+i][n+i][1]=(a[i]%10);
	    if(a[i]<0)
	    {
		    F[i][i][1]+=10;
		    F[n+i][n+i][1]=f[i][i][1]=f[n+i][n+i][1]=F[i][i][1];
	    }
    }
    DP();
	printf("%d\n%d",MIN,MAX);
}