HDU 1231 最大连续子序列——最大连续和+输出其起始点

题意:求一个序列的最大连续和

思路:普通的求最大连续和算法,但是起始点的更新要特别注意,首先起始点的更新一定是在更新最大连续和ans的时候更新,但是在sum < a[i]的时候我们可能也要更新起点,说“可能”的原因是:如果不更新的话后面如果有更大的连续和就会出错,如果直接更新的话如果后面没有更大的连续和也会出错,所以我们采用延迟更新的思想,设置一个lazy变量,当sum

还有就是一般的写法可能不能兼顾题目中的所有条件(比如我的主要算法没法实现最后一组输出0 0 0 的样例),所以采用了特殊条件特殊判断的思想

#include 
#include 
#include 
#include 

using namespace std;

const int maxn = 1e5 + 10;

int n, a[maxn];

int main()
{
    while (scanf("%d", &n) == 1 && n) {
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
        }
        int lazy = 1, L = 1, R = 0, sum = 0, ans = 0;
        for (int i = 1; i <= n; i++) {
            sum += a[i];
            if (sum < a[i]) {
                sum = a[i];
                lazy = i;
            }
            if (sum > ans) {
                ans = sum;
                L = lazy;
                R = i;
            }
        }
        if (L > R) {
            bool ok = false;
            for (int i = 1; i <= n; i++) {
                if (a[i] == 0) {
                    ok = true;
                    break;
                }
            }
            if (ok) {
                printf("%d %d %d\n", 0, 0, 0);
            }
            else {
                printf("%d %d %d\n", 0, a[1], a[n]);
            }
        }
        else {
            printf("%d %d %d\n", ans, a[L], a[R]);
        }
    }
    return 0;
}


你可能感兴趣的:(动态规划)