最大子段和比较好求解,就是一个dp标记走就可以了,当dp<0,让dp等于当前位,dp大于0就加上当前位就好。
最小子段和就是把所有的元素去相反数,然后在此基础上求一个最大子段和就好。
主要想说的是最小正子段和的求法,是先算前i位的累加和dp[i],并记录标记为i。
然后对所有的dp[i]进行小到大的排序,然后对两个相连的dp[i],如果后者的标记大于前者的标记,那么它们的差值是候选答案,然后选取候选答案最小的那个。
PS:注意要在里面加一个标记为-1的,和为0的节点。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
/***********************
51nod 1065最小正子段和
***********************/
struct Node{
__int64 val, flag;
};
Node node[50005];
__int64 N, num[50005];
bool comp(Node a, Node b)
{
if