DP 動態規劃 Problem A 1001 最長子序列

Problem A  ID:1001 


簡單題意:給出一組含負數的數,求最大子序列,並求出此序列的首尾位置。


解題思路形成過程:從第一個數開始遍歷,一直遍歷到最後一個。

            除第一個數以外:如果以前一個數爲尾的最大子序列(設爲cmax[i-1])大於等於0,則以當前這個數(設爲a[i])爲結尾的最大子序列爲cmax[i]=cmax[i-1]+a[i];反之,如果cmax[i-1]<0,則cmax[i]=a[i]

            用另一個數組來儲存以每個數爲結尾時,最大子序列的起始位置。

            找出其中的最大值,輸出i的位置,以及相對應的子序列的起始位置。


感想:這道題的輸出格式很容易出現錯誤,最後一組數據輸出後不輸出回車也會PE。

    細節上出現了一點小問題,導致一種情況會出現錯誤(比如所有數都是相同的負數時)。

    代碼最起碼在邏輯上一定要足夠完美。如果出現了WA,就想想還有那種情況出現在了考慮之外,多想幾種樣例來試一下。


代碼:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int a[2000001];
int cmax[2000001];
int tag[2000001];
int main()
{
   // freopen("1.txt","r",stdin);
    int n,p=1;
    cin>>n;
    while(n--)
    {
        int num,tmax,ttag;
        scanf("%d",&num);
        for(int i=0;i<num;++i){
            scanf("%d",&a[i]);
            if(i==0){
                cmax[0]=a[0];
                tag[0]=0;
                tmax=a[0];
                ttag=0;
            }
            else{
                if(cmax[i-1]>=0){
                    cmax[i]=a[i]+cmax[i-1];
                    tag[i]=tag[i-1];
                }
                else{
                    cmax[i]=a[i];
                    tag[i]=i;
                }
                if(cmax[i]>tmax){
                    tmax=cmax[i];
                    ttag=i;
                }
            }
        }
        printf("Case %d:\n",p++);
        printf("%d %d %d",tmax,tag[ttag]+1,ttag+1);
        if(n!=0)
            printf("\n\n");
        else
            printf("\n");
    }
}

發佈了48 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章