AcWing爬山

這是2006北大舉辦的ACM的一道題。c++

題意爲:給定景點海拔高度,隊員們不去遊覽相同高度的景點,一開始往上爬,一但往下爬就不能再向上爬,求最多能夠遊覽多少個景點。那麼咱們能夠獲得一個結論:以一個最高點爲區分,前面的是最大上升子序列,後面的是最大降低子序列。而後咱們就完全把此傳化爲了LIS問題。咱們開始思考:集合?以峯值爲終點的最大子序列長度(一個1-n;一個n~1)。屬性?最大值。劃分依據與計算?以a[i]結尾的序列a[1],a[2],a[i-1],a[i]裏找到a[j]<a[i[,那麼狀態則能夠轉化爲前面那個數的狀態+1,而後與當前進行比較便可。固然當j=0時,dp[i]=1。其次要注意這個反向的時候逆序來求,要再開一個集合。最後枚舉峯值點便可。spa

代碼code

#include<bits/stdc++.h>
#define maxn 1010
using namespace std;
int dp1[maxn],dp2[maxn];
int n;
int a[maxn];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        dp1[i]=1;
        for(int j=1;j<i;j++){
            if(a[i]>a[j]){
                dp1[i]=max(dp1[i],dp1[j]+1);
            }
        }
    }
    for(int i=n;i>=1;i--){
        dp2[i]=1;
        for(int j=n;j>i;j--){
            if(a[i]>a[j]){
                dp2[i]=max(dp2[i],dp2[j]+1);
            }
        }
    }
    int res=0;
    for(int i=1;i<=n;i++){
        res=max(res,dp1[i]+dp2[i]-1);
    }
    cout<<n;
    return 0;
}
相關文章
相關標籤/搜索