看其他人解释即可
https://blog.csdn.net/pmt123456/article/details/52695470
想了两小时 题解看了一小时
这个dp的思路颇为奇妙,好奇他们怎么想出来的
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int num[maxn];
long long dp[maxn];
long long pre[maxn];
int main()
{
int m,n;
while(cin>>m>>n)
{
memset(dp,0,sizeof(dp));
memset(pre,0,sizeof(pre));//必须清一次以免上次干扰
for(int j=1;j<=n;j++)
{
scanf("%d",&num[j]);
}
long long tmp;
for(int i=1;i<=m;i++)
{
tmp=-0x7fffffff;
for(int j=i;j<=n;j++)
{
dp[j]=max(dp[j-1]+num[j],pre[j-1]+num[j]);
pre[j-1]=tmp;
tmp=max(tmp,dp[j]);
}
}
printf("%lld\n",tmp);
}
}