#include <iostream>
#include<string.h>
#define ll long long
using namespace std;
int main()
{
int m,n;
while(cin>>m>>n){
int a[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
ll dp[m+1][n+1];
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)//遍历每个子段
{
for(int j=i;j<=n-m+i;j++)//往后遍历
{
if(j>i)
{
dp[i][j]=dp[i][j-1]+a[j];
for(int k=i;k<=j-1;k++)//当第j个元素不属于i段的时候,寻找前面的那个最大值
{
if(dp[i][j]<dp[i-1][k]+a[j])
{
dp[i][j]=dp[i-1][k]+a[j];
}
}
}
else//初始化用的,当j==i的时候,直接+当前值
{
dp[i][j]=dp[i-1][j-1]+a[j];
}
}
}
cout<<dp[m][n]<<endl;
}
return 0;
}
HDU 1024 最大m子段和
最新推荐文章于 2020-08-10 22:06:12 发布