本题有两个坑点,一个是数字溢出,一个是负数的取模。除此之外这题做法几乎与P1018一毛一样。
#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
#define MAX 0x3f3f3f3f
ll dp1[101][101];
ll dp2[101][101];
ll vos[101];
int main()
{
ll m,n;
cin>>m>>n;
for(ll i=1; i<=m; i++)
{
cin>>vos[i];
vos[i+m]=vos[i];
}
for(ll i=1; i<2*m; i++)
vos[i]+=vos[i-1];
ll minn=MAX;
ll maxx=-minn;
n--;
for(ll i=1; i<=m; i++)
{
memset(dp1,0,sizeof(dp1));
memset(dp2,MAX,sizeof(dp2));
for(ll l=i; l<2*m; l++)
{
vos[l]-=vos[i-1];
dp1[0][l]=dp2[0][l]=(vos[l]%10+10)%10;
}
for(ll j=1; j<=n; j++)
{
for(ll k=j; k<m+i; k++)
{
for(ll p=i; p<k; p++)
{
dp1[j][k]=max(dp1[j][k],dp1[j-1][p]*(((vos[k]-vos[p])%10+10)%10));
if(dp2[j-1][p]<=0x3f3f3f3f)
dp2[j][k]=min(dp2[j][k],dp2[j-1][p]*(((vos[k]-vos[p])%10+10)%10));
}
}
}
minn=min(minn,dp2[n][i-1+m]);
maxx=max(maxx,dp1[n][i-1+m]);
}
cout<<minn<<'\n'<<maxx<<endl;
}