HDU 1003 dp

解題思路:這道題是典型的求最大連續子序列,並且輸出 最大連續子序列的第一個元素的位置和最後一個元素的位置
核心dp方程爲sum[i] = max(sum[i - 1] + data[i],data[i])
以核心dp方程的思想去考慮這道題,若以傳統的方式去用數組存儲整個序列,不僅代碼繁瑣,並且效率不是很高,
沒輸出一個數字,對其進行操作,用兩個for循環既可以記錄樣例的編號,又可以清晰記錄最大連續子序列的起始位置和
終止位置

#include<cstdio>
using namespace std;


int main()
{
    int t,sum,max;
    int data,start,End;
    int a, b, A,B,n;
    scanf("%d",&t);
    for(int i = 1; i <= t; i++)
    {
        sum = max = -10001;
        scanf("%d",&n);
        for(int j = 1; j <=n; j++)
        {
            scanf("%d",&data);
            if(sum + data < data)
            {
                sum = data;
                a = b = j;
            }
            else
            {
                sum += data;
                ++b;//應該是++b,而不是b++,因爲要判斷加上當前的這個數時,新sum是否比舊sum小
            }
            if(max<sum)//將當前的最大的值保存在Max中,在樣例中就有體現
            {
                max = sum; A = a;
                B = b;
            }
        }
        printf("Case %d:\n%d %d %d\n",i,max,A,B);
        if(i != t)
            printf("\n");


        }
        return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章