版权声明:那个,最起码帮我加点人气吧,署个名总行吧 https://blog.csdn.net/qq_41670466/article/details/83388008
题意是给你个数字序列,现在让你把这个序列分成m个连续的子序列,且要求这m个子序列的累加和最大。
思路:这道题的题意可以理解为问在序列为末尾时,把序列分为m个子序列这个状态时的最大累加和,那么可以得出这个状态应该是由上一个状态转移得来:(因为dp[i][j]表示数到第j个字符时,前j个数字序列被分为i组时的最大值)dp【i][j]=max(dp[i-1][j]+num[j],dp[i][j-1]+num[j])这两种状态,第一种转移状态意思是第j个数字合并到上一个分组中构成新的分组,第二个状态是第j个数字自己构成一个分组;
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e6 + 10;
const int inf = 0x7ffffff;
int dp[maxn], pre[maxn];//dp[i]表示第i个位置的最大累加和,pre[i]表示i前面的数字的最大累加和;
int num[maxn];
int main()
{
int n, m;
while (scanf("%d %d", &m, &n) != EOF)
{
memset(dp, 0, sizeof(dp));
memset(pre, 0, sizeof(pre));
for (int i = 1; i <=n; i++)
scanf("%d", &num[i]);
int temp;
for (int i = 1; i <= m; i++)
{
temp = -inf;
for (int j = i; j <= n; j++)
{
dp[j] = max(dp[j - 1], pre[j - 1])+num[j];
pre[j-1] = temp;
temp = max(temp, dp[j]);
}
}
printf("%d\n", temp);
}
system("pause");
return 0;
}