• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

hdu 1024 Max Sum Plus Plus m段连续子序列最大和 dp

//这题的方程不会列,看了别人解题报告才懂
//设dp[i][j]为i段以a[j]结尾子序列的最大和
//dp[i][j] = max(dp[i][j-1]+a[j], dp[i-1][k]+a[j])
//由于题目规模巨大,不能使用二维数组存,需要优化
//经分析,可以优化成两个一维数组
//dp[j]为以a[j]结尾的子序列最大和,pre[j]则是记录前个段(即第i-1段)到a[j-1]为止的最大值
//dp[j] = max(dp[j-1]+a[j], pre[j-1]+a[j])
#include <iostream>
using namespace std;

const int N = 1000005;
const int INF = 1000000000;

int dp[N];
int pre[N];
int a[N];

int main()
{
	int n, m;
	int maxx;
	while (scanf("%d%d", &m, &n) != EOF)
	{
		for (int i = 1; i <= n; i++)
		{
			dp[i] = 0;
			pre[i] = 0;
			scanf("%d", &a[i]);
		}

		dp[0] = 0;
		pre[0] = 0;

		for (int i = 1; i <= m; i++)
		{
			maxx = -INF;
			for (int j = i; j <= n; j++)
			{
				dp[j] = max (dp[j-1]+a[j], pre[j-1]+a[j]);
				pre[j-1] = maxx;
				maxx = max(dp[j], maxx);
			}
		}
		printf("%d\n", maxx);
	}
	return 0;
}

posted on 2011-02-18 22:49  sysuwhj  阅读(507)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3