hdu1003Maxsum(最大子列和问题)

题目链接

这道题目标是解决最大连续子序列和的问题,属于动态规划中的经典问题,但又有所变形

增加了要求:即求解出最大连续子列和的开始首项和末项的位置。

但其核心思想没有变化,仍然沿用dp[i]=max{a[i],dp[i-1]+a[i]}这一状态转移方程,其中dp[i]是以第i个元素结尾的最大连续子序列和,a[i]为第i个元素的大小。

这是我第一次wa的代码

// ConsoleApplication68.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>
#include<algorithm>
int a[100000], dp[100000];
using namespace std;
int main()
{
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int num = 1;
		while (n--)
		{
			int len;
			scanf("%d", &len);
			for (int i = 1;i <= len;i++)
			{
				scanf("%d", &a[i]);
			}
			dp[1] = a[1];
			for (int i = 2;i <= len;i++) { dp[i] = max(dp[i-1]+a[i],a[i]); }
			int k = 1;
			for (int i = 2;i <= len;i++)
			{
				if (dp[i] > dp[k])k = i;
			}
			int head, tail = k;
			if (dp[k] == a[k]) head = k;
			else {
				int mark = k;
				while (dp[mark] != a[mark]) {
					mark--;
				}
				head = mark;
			}
			printf("case %d:\n", num);num++;
			printf("%d %d %d\n\n", dp[k], head, tail);
		}
	}
    return 0;
}

在检查后发现,就是在第二组样例(7 0 6 -1 1 -6 7 -5)中,他有一个现象就是,单独第六个拿出来的元素大小与前六个和相等,而我的找头,尾位置中的头的查找方法是利用dp[i]与a[i]的相等与否来完成,所以有所欠缺(错误就出现于此)。(可见这个方法适用于大部分的情况,少考虑了这种特殊情况)头尾的找法,最好是与找最大序列和同时进行,虽然方便,但反而给后面增加了麻烦,所以还是要根据实际情况来使用库!

下面是参考了这个这位博主的博客,最终完成了,思路也非常清楚,很棒!

链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值