zoukankan      html  css  js  c++  java
  • AcWing登山

    这是2006北大举办的ACM的一道题。

    题意为:给定景点海拔高度,队员们不去游览相同高度的景点,一开始往上爬,一但往下爬就不能再向上爬,求最多可以游览多少个景点。那么我们可以得到一个结论:以一个最高点为区分,前面的是最大上升子序列,后面的是最大下降子序列。然后我们就彻底把此传化为了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。其次要注意这个反向的时候逆序来求,要再开一个集合。最后枚举峰值点即可。

    代码

    #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;
    }
  • 相关阅读:
    链接和作用域2 C++快速入门43
    位运算符
    代码编辑器和代码浏览器
    关系运算符
    delphi教程 | 第一个程序
    代码编辑器和代码浏览器
    链接和作用域2 C++快速入门43
    delphi教程 | 第一个程序
    位运算符
    [原创 js] 点击即可修改内容函数
  • 原文地址:https://www.cnblogs.com/china-mjr/p/11750025.html
Copyright © 2011-2022 走看看