hdu1024 动态规划

版权声明:那个,最起码帮我加点人气吧,署个名总行吧 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/83388008