題目十七--經典的動態規劃問題

題目:

Maximum Subsequence Sum
我的代碼:
#include<iostream>
using namespace std;


int main(){
    int a[10001],dp[10001],N;  //dp是第i個元素前面的累加和(包括i)
    int flag = 0;
    int max,start,end,s,e;
    cin>>N;
    
    for(int i = 0;i < N;i++){
        cin>>a[i];
        if(a[i] >= 0) flag = 1;
    }
    if(flag == 0){ //輸入的數組全爲負數
        cout<<0<<' '<<a[0]<<' '<<a[N-1];
        return 0;
    } 
    
    //dp[i]=max(dp[i-1]+a[i],a[i])  --狀態方程
    dp[0] = a[0];
    max = a[0];
    s = e =0;
    for(int i = 1;i < N;i++){
        if(a[i] <= dp[i-1] + a[i]){
            dp[i] = dp[i-1] + a[i];
            e = i;
        } 
        else {   //序列已達最大值,需要更換序列
            dp[i] = a[i];
            s = e = i;
        }
        if(max < dp[i]){ //只有序列比之前的序列和要大,才改變max和始點、終點的值
            start = s;
            end = e;
            max = dp[i];
        }
    }
    
    cout<<max<<' '<<a[start]<<' '<<a[end];
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章