鍍金池/ 問答/網(wǎng)絡(luò)安全/ 最大上升子序列和

最大上升子序列和

一個(gè)數(shù)的序列bi,當(dāng)b1 < b2 < ... < bS的時(shí)候,我們稱這個(gè)序列是上升的。對(duì)于給定的一個(gè)序列(a1, a2, ...,aN),我們可以得到一些上升的子序列(ai1, ai2, ..., aiK),這里1 <= i1 < i2 < ... < iK <= N。比如,對(duì)于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。這些子序列中序列和最大為18,為子序列(1, 3, 5, 9)的和. 你的任務(wù),就是對(duì)于給定的序列,求出最大上升子序列和。注意,最長(zhǎng)的上升子序列的和不一定是最大的,比如序列(100, 1, 2, 3)的最大上升子序列和為100,而最長(zhǎng)上升子序列為(1, 2, 3)。
下面是我的代碼,沒有AC,想問一下問題在哪
請(qǐng)輸入代碼

include<stdio.h>

int max(int a,int b){

return a>b? a:b;

}
int dp[1000];
int list[1000];
int main(){

int n;
while(~scanf("%d",&n)){       
    for(int i=0;i<n;i++)
        scanf("%d",&list[i]);
    dp[0]=list[0];
    for(int i=1;i<n;i++){
        int tmax=dp[0];
        for(int j=0;j<i;j++){
            if(list[i]>list[j]&&dp[j]>tmax){
                tmax=dp[j];
            }
        }
        dp[i]=tmax+list[i];
    }
    int max=-123123123;
    for(int i=0;i<n;i++){
        if(dp[i]>max){
            max=dp[i];
        }
    }
    printf("%d\n",max);
    
    
}

}

回答
編輯回答
雨萌萌

輸入3個(gè)數(shù) 2,1,2你的返回值是5 明顯不對(duì)啊

    for(int i=1;i<n;i++){
        int tmax=0;    //不是dp[0],list[1]<list[0] 的話dp[1] = 0 + list[1]
        for(int j=0;j<i;j++){
            if(list[i]>list[j]&&dp[j]>tmax){
                tmax=dp[j];
            }
        }
        dp[i]=tmax+list[i];
    }
2018年9月14日 04:06