和最大的子序列(簡單dp)

題目來源:[NWPU][2014][TRN][6]動態規劃第一講——簡單線性dp D題

http://vjudge.net/contest/view.action?cid=49759#problem/D

題目:給定一個有限數列,找出一個子序列使得它們的和加起來不小於別的任意一個子序列,如果有多個,則第一個爲所求,並確定所求的子序列第一個和最後一個元素的腳標

            ,用空行隔開各組輸出,輸入的數據最大爲1000,最小爲-1000,最多一個數列有100000個數據

作者:npufz

代碼:

#include<iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{int  a[100003],t,n,i,j,k,jb;
cin>>t;
for(k=1;k<=t;k++)
{ cin>>n;
for(i=0;i<n;i++)
    scanf("%d",&a[i]);
for(i=1;i<n;i++)
    if(a[i-1]>=0) a[i]+=a[i-1];
j=-20000;
for(i=0;i<n;i++)
    if(a[i]>j) {j=a[i];jb=i;}
    i=jb;
    for(;i>=0&&a[i]>=0;i--);
   cout<<"Case "<<k<<":"<<endl;
   if(k<t){
    if(a[jb]<0) cout<<j<<" "<<i+1<<" "<<jb+1<<endl<<endl;
   else  cout<<j<<" "<<i+2<<" "<<jb+1<<endl<<endl;}
   else { if(a[jb]<0) cout<<j<<" "<<i+1<<" "<<jb+1<<endl;
   else  cout<<j<<" "<<i+2<<" "<<jb+1<<endl;}
}
return 0;
}

反思:對大批數據的調入,SCANF比CIN省時,一開始沒有考慮對最大值爲負值的情況,就造成了角標判斷錯誤,改正後竟然會是PRESENTATION ERROR,後來發現原來是最後一組數據也多了一個空行出來,題意是要求用空行把各組結果分開而沒有說每組數據輸出後有一個空行


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