不是所有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; }