HDU 1231 最大连续子序列(dp)

题目链接:HDU 1231 最大连续子序列

dp。

状态转移方程:dp[i]=max(dp[i-1]+arr[i],arr[i]),从左到右扫一遍。dp[i]表示从1(下标从1开始)到i的最大连续子序列的值,这个值要包括arr[i],然后从前往后循坏找最大值。

WA了几次,后来发现是数组开小了,10000看成了1000,郁闷。

#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;

const int MAX_N = 10000 + 100;
int dp[MAX_N],arr[MAX_N];
int _beg[MAX_N];
int k;

int main()
{
    while(scanf("%d",&k),k)
    {
        for(int i = 1;i <= k;i++)
            scanf("%d",&arr[i]);
        dp[1] = arr[1];
        int temp = 1;
        _beg[1] = temp;
        for(int i = 2;i <= k;i++)
        {
            if(dp[i - 1] + arr[i] >= arr[i])
            {
                dp[i] = dp[i - 1] + arr[i];
                _beg[i] = temp;
            }
            else
            {
                dp[i] = arr[i];
                _beg[i] = temp = i;
            }
        }
        int _max = -1;
        int j = 0;
        for(int i = 1;i <= k;i++)
        {
            if(_max < dp[i])
            {
                _max = dp[i];
                j = i;
            }
        }
        if(_max == -1)
            printf("%d %d %d\n",0,arr[1],arr[k]);
        else
            printf("%d %d %d\n",_max,arr[_beg[j]],arr[j]);
    }
    return 0;
}




你可能感兴趣的:(HDU 1231 最大连续子序列(dp))