【例9.3】求最長不下降序列


【例9.3】求最長不下降序列

【例9.3】求最長不下降序列


時間限制: 1000 ms         內存限制: 65536 KB
提交數: 278     通過數: 76 

【題目描述】

設有由n(1<=n<=200)個不相同的整數組成的數列,記為:b(1)、b(2)、……、b(n)且b(i)<>b(j)(i<>j),若存在i1<i2<i3< … < ie 且有b(i1)<b(i2)< … <b(ie)則稱為長度為e的不下降序列。程序要求,當原數列出之后,求出最長的不下降序列。

例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一個長度為7的不下降序列,同時也有7 ,9,16,18,19,21,22,63組成的長度為8的不下降序列。

 

【輸入】

第一行為n,第二行為用空格隔開的n個整數。

【輸出】

第一行為輸出最大個數max(形式見樣例);

第二行為max個整數形成的不下降序列,答案可能不唯一,輸出一種就可以了,本題進行特殊評測。

【輸入樣例】

14
13 7 9 16 38 24 37 18 44 19 21 22 63 15

【輸出樣例】

max=8
7 9 16 18 19 21 22 63

【來源】

http://ybt.ssoier.cn:8088/problem_show.php?pid=1259
No

 

犯了一個低級錯誤,好不容易發現,所以通過60%

1、更新內容不要和max,min一起寫

 

/*
遞推表達式:
f[i]表示前i個數能夠組成的最長不下降序列
我們采用填表法
遍歷前i-1個,f[i]=max(f[j])+1 a[j]<=a[i] 

*/
#include <bits/stdc++.h>
const int MAXN=2e3+10;
using namespace std;
int a[MAXN],f[MAXN],pre[MAXN];
int n,maxv=0,max_i;

void print1(){
    for(int i=1;i<=n;i++) cout<<setw(3)<<a[i]<<" "; cout<<endl; 
    for(int i=1;i<=n;i++) cout<<setw(3)<<f[i]<<" "; cout<<endl; 
    for(int i=1;i<=n;i++) cout<<setw(3)<<pre[i]<<" "; cout<<endl; 
}

void print(int i){
    if(i!=0){ print(pre[i]); cout<<a[i]<<" ";}
}

int main(){
    //freopen("in.txt","r",stdin);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        f[i]=1;
        for(int j=1;j<i;j++){
            if(a[j]<=a[i]&&f[j]+1>f[i]){
                f[i]=f[j]+1;pre[i]=j;
            }
        }
        if(f[i]>=maxv){
            maxv=max(maxv,f[i]);
            max_i=i;
        }
    }
    cout<<"max="<<maxv<<endl;
    print(max_i);
    cout<<endl;
    //print1();
    return 0;
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM