代码:
//P1043 [NOIP2003 普及组] 数字游戏
//取余记得非负
#include<bits/stdc++.h>
using namespace std;
const long long INF=0x7fffffffffffff;
long long a[100+10],w[100+10][100+10],dpmin[100+10][100+10][10+10],dpmax[100+10][100+10][10+10];
inline long long read()
{
long long s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
return s*w;
}
int main()
{
int n=read(),m=read();
for(int i=1;i<=n;++i)
a[i]=read(),a[i+n]=a[i];
for(int i=1;i<=2*n;++i)
for(int j=i;j<=2*n&&j-i<n;++j)
for(int k=1;k<=m;++k)
dpmin[i][j][k]=INF,dpmax[i][j][k]=-INF;
for(int i=1;i<=2*n;++i)
w[i][i]=a[i],dpmin[i][i][1]=(a[i]%10+10)%10,dpmax[i][i][1]=(a[i]%10+10)%10;
for(int i=1;i<=2*n;++i)
for(int j=i+1;j<=2*n&&j-i<n;++j)
{
w[i][j]=w[i][j-1]+a[j],dpmin[i][j][1]=(w[i][j-1]+a[j])%10,dpmax[i][j][1]=(w[i][j-1]+a[j])%10;
if(dpmin[i][j][1]<0)dpmin[i][j][1]=10+dpmin[i][j][1];
if(dpmax[i][j][1]<0)dpmax[i][j][1]=10+dpmax[i][j][1];
}
for(int i=1;i<=2*n;++i)
for(int j=i+1;j<=2*n&&j-i<n;++j)
for(int k=2;k<=min(j-i+1,m);++k)
{
for(int l=i;l<j;++l)
{
for(int o=1;o<k&&l-i+1>=o;++o)
{
dpmin[i][j][k]=min(dpmin[i][j][k],dpmin[i][l][o]*dpmin[l+1][j][k-o]);
//if(i==1&&j==4&&l==2)printf("%lld %lld %d\n",dpmin[i][l][o],dpmin[l+1][j][k-o],o);
dpmax[i][j][k]=max(dpmax[i][j][k],dpmax[i][l][o]*dpmax[l+1][j][k-o]);
//if(i==4&&j==7&&l==6)printf("%lld %lld %d\n",dpmin[i][l][o],dpmin[l+1][j][k-o],o);
}
}
}
long long ans_min=INF,ans_max=-INF;
for(int i=1;i<=n+1;++i)
ans_min=min(ans_min,dpmin[i][i+n-1][m]),ans_max=max(ans_max,dpmax[i][i+n-1][m]);
printf("%lld\n%lld",ans_min,ans_max);
return 0;
}
我试着把INF减掉几个f以后就过了???为什么呢。。。。。。
感谢大佬指教!