sbt交了三遍才过是我的耻辱……
就是设f[i][j]搞个三重循环DP一下,以上。
#include<cstdio> #include<cstdlib> #include<cctype> #include<algorithm> #include<cstring> #define maxn 550 using namespace std; inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch==‘-‘) f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-‘0‘; ch=getchar(); } return num*f; } long long f[maxn][maxn]; long long ans; long long sum[maxn]; int main(){ int n=read(),m=read(); for(int i=1;i<=n;++i) sum[i]=sum[i-1]+read(); memset(f,-127/3,sizeof(f)); ans=0; f[0][0]=0; for(int i=1;i<=n;++i){ f[i][0]=0; for(int j=1;j<=i&&j<=m;++j){ f[i][j]=max(f[i][j],f[i-1][j]); for(int k=0;k<i;++k){ f[i][j]=max(f[i][j],f[k][j-1]+sum[i]-sum[k]); ans=max(ans,f[i][j]); } } } printf("%lld\n",ans); return 0; }