动态规划-最长不下降子序列

Posted TQCAI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划-最长不下降子序列相关的知识,希望对你有一定的参考价值。

代码:

技术分享图片
#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>


#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 101
#define MAX 1<<30
#define V vector<int>

using namespace std;

int a[LEN];
int dp[LEN];
int n;

void printAns(int cnt,int pos,V vec){
    vec.insert(vec.begin(),a[pos]);
    int obj=dp[pos--]-1;
    while(pos>0){
        if(dp[pos]==obj)
            printAns(cnt-1,pos,vec);
        pos--;
    }
    if(cnt==1){
        int i;
        FF(i,vec.size())
            O("%d ",vec[i]);
        OL("");
    }
}

void DP_n2(){
    int i,j,p;
    int ans=0;
    F(i,1,n+1){
        dp[i]=1;
        F(j,1,i){
            if(a[j]<a[i])
                dp[i]=max(dp[i],dp[j]+1);
        } 
        if(dp[i]>ans){
            ans=dp[i];
            p=i;
        }
    }
    O("ans=%d p=%d\n序列 :\n",ans,p);
    F(i,1,n+1)O("%d ",a[i]) ;
    OL("\nDP数组 :");
    F(i,1,n+1)O("%d ",dp[i]) ;
    OL("");
    V vec;
    OL("所有LIS :");
    printAns(ans,p,vec);
} 

void DP_nLogn(){
    int i,j,top=0;
    F(i,1,n+1){
        if(top==0 || dp[top-1]<a[i]) 
            dp[top++]=a[i];
        else{
            int pos=lower_bound(dp,dp+top,a[i])-dp;
            dp[pos]=a[i];
        }
    }
    printf("%d\n",top);
    OL("DP数组: ");
    F(i,0,top)O("%d ",dp[i]);
    OL("\n") ;
}
int main()
{   
//dilworth定理:LIS 长度   等于  LIS 子序列 个数
    freopen("LIS.txt","r",stdin);
    int i,j;
    I("%d",&n);
    F(i,1,n+1){
        I("%d",&a[i]);
    }
    
    DP_nLogn();
    DP_n2();
    return 0;
}
View Code

测试数据:

11
1 3 7 6 8 5 3 2 7 2 9

 

以上是关于动态规划-最长不下降子序列的主要内容,如果未能解决你的问题,请参考以下文章

用数学语言说一下动态规划求数列最长递增子序列的解

动态规划——最长不下降子序列(LIS)

网络流24题最长不下降子序列(最大流,动态规划)

关于用动态规划法求最大公共子序列的问题

动态规划——总结

动态规划|蒜头君跳木桩-最长下降子序列