不是所有dp都不卡边界= - =比如这个边界就很卡
#include <bits/stdc++.h>
using namespace std;
const int N=105,M=10,inf=2e9+1;
int sum[N];
int Fmax[N][N][M];//区间l~r中分i段能获得的max
int Fmin[N][N][M];//区间l~r中分i段能获得的max
inline int cnt(int x)
{
return (x%10+10)%10;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {scanf("%d",&sum[i]);sum[i+n]=sum[i];}
for(int i=1;i<=2*n;i++) sum[i]+=sum[i-1];
//先输出min,再输出max
for(int i=1;i<=2*n;i++)
{
for(int j=i;j<=2*n;j++)
{
Fmin[i][j][1]=Fmax[i][j][1]=cnt(sum[j]-sum[i-1]);
}
}
for (int i=2;i<=m;i++)
for (int l=1;l<=2*n;l++)
for (int r=l+i-1;r<=2*n;r++)
Fmin[l][r][i]=inf;
for(int k=2;k<=m;k++)//枚举段数
{
for(int l=1;l<=2*n;l++)//枚举左端点
{
for(int r=l+k-1;r<=2*n;r++)//枚举右端点
{
for(int i=l+k-2;i<=r-1;i++)
{
Fmax[l][r][k]=max(Fmax[l][r][k],Fmax[l][i][k-1]*cnt(sum[r]-sum[i]));
Fmin[l][r][k]=min(Fmin[l][r][k],Fmin[l][i][k-1]*cnt(sum[r]-sum[i]));
}
}
}
}
int ans1=inf,ans2=0;
for(int i=1;i<=n;i++)
{
ans1=min(ans1,Fmin[i][i+n-1][m]);
ans2=max(ans2,Fmax[i][i+n-1][m]);
}
printf("%d\n%d\n",ans1,ans2);
return 0;
}
京公网安备 11010502036488号