#include<bits/stdc++.h>
using namespace std;
int n,m,a[1001],b[1001],f[101][101][101],g[101][101][101],ans1=INT_MAX,ans2;
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i+n]=a[i];
}
for(int i=1;i<=2*n;i++)
b[i]=b[i-1]+a[i];
for(int i=1;i<=2*n;i++)
for(int j=i;j<=2*n;j++)
f[i][j][1]=g[i][j][1]=((b[j]-b[i-1])%10+10)%10; //初始化,无论大小在区间为 1时都只有一种情况
for(int i=2;i<=m;i++) //找整整两天才找到,i的起点是2
for(int j=1;j<=2*n;j++)
for(int k=i+j-1;k<=2*n;k++)
g[j][k][i]=ans1; //顺序!!!
for(int l=2;l<=m;l++){
for(int i=1;i<=2*n;i++){
for(int j=i+l-1;j<=2*n;j++){
for(int k=i+l-2;k<j;k++){
f[i][j][l]=max(f[i][j][l],f[i][k][l-1]*(((b[j]-b[k])%10+10)%10));
g[i][j][l]=min(g[i][j][l],g[i][k][l-1]*(((b[j]-b[k])%10+10)%10));
}
}
}
}
for(int i=1;i<=n;i++){
ans1=min(g[i][i+n-1][m],ans1);
ans2=max(f[i][i+n-1][m],ans2);
}
printf("%d\n%d\n",ans1,ans2);
return 0;
}
【03NOIP普及组】数字游戏
最新推荐文章于 2024-12-04 16:34:40 发布