[动态规划] HDU-1003最大子序列和

问题链接:杭电OJ
解题思路:

主要思想是动态规划的思想,maxSum中储存了当前位置 j 之前的最大子序列和。

我们考虑到:当某一子序列的和为负数时,在读取新的数n[j]时,它总会有一定的抵消作用使新的和比n[j]小,即它不可能对最大子序列和做出更多的贡献。故此时我们可以丢弃这一段子序列,转而从它后面着手。(当然了,如果这一子序列仅包含第一个数字,我们要将它记录在maxSum中)。

借此我们容易得到状态转移方程:

dp[j] = max(dp[j-1]+n[j] , n[j]) (此处dp[j]表示位置 j 之前的最大子序列和)

我的代码没有用到dp数组,是因为我们是从前到后进行读取的,可以仅用到数组n来完成算法。解释:

因为本题是从前到后进行数字的读取,与题目所要求得到的答案的顺序(子序列,从前往后连续)相同。故而dp数组(dp[j]表示位置j之前的最大子序列之和)的作用完全可以由maxSum替代。

AC代码:
#include <bits/stdc++.h>
using namespace std;
int n[100000];
int amount;

int</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值