问题链接:杭电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</