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