【菜鸟er】动态规划_最长递增子序列

原创 2018年04月17日 18:07:07
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 100
int a[MAX_N];
int dp[MAX_N][MAX_N];
int dpLCS[MAX_N][MAX_N];
int n,m;
//方法1:公共子序列法;
int LCS(void);
//方法2:动态规划算法;
int LISdp(void);
//方法3:nLGn算法
int nlgn(void);
int DP[MAX_N];//动态规划数组
int len;//标记DP[]内有效元素个数
int er_search(int w);//返回dp数组处理位置的二分搜索
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)    cin>>a[i];

    int x1 = LCS();
    cout<<x1<<endl;

    int x2 = LISdp();
    cout<<x2<<endl;

    int x3 = nlgn();
    cout<<x3<<endl;
    return 0;
}
/**
data:
6
5 6 7 1 2 8
print:4
*/
int LCS(void)
{
    int b[MAX_N];
    memset(b,0,sizeof(int));
    for(int i=0;i<n;i++){
        b[i]=a[i];
    }
    sort(b,b+n);

     for(int i = 0;i<n;i++){
        for(int j = 0;j<n;j++){
            if(a[i] == b[j]){
                dpLCS[i+1][j+1] = dpLCS[i][j]+1;
            }
            else{
                dpLCS[i+1][j+1] = max(dpLCS[i+1][j], dpLCS[i][j+1]);
            }
        }
    }
    return dpLCS[n][n];

}

int LISdp(void)
{
    int dp[MAX_N]={0};
    for(int i = 0;i<n;i++){
        dp[i]=1;
        for(int j = 0;j<i;j++){
            if(a[i]>a[j]){
                dp[i] = max(dp[i],dp[j]+1);
            }
        }
    }
    int maxlen=0;
    for(int i = 0;i<n;i++){
        if(dp[i]>maxlen) maxlen = dp[i];
        //cout<<dp[i]<<" ";
    }
    return maxlen;
}
/**
DP[]存储对应长度LIS的最小末尾。
**/
int nlgn(void)
{
    len = 1;//dp长度标记
    DP[0] = a[0];//初始化第一个
    int pos=0;//临时下标

    for(int i = 0;i<n;i++){
        if(a[i]>DP[len-1]){//如果大于就在后面接上
            DP[len] = a[i];
            ++len;
        }
        else{//否则准备插入
            pos = er_search(a[i]);
            DP[pos] = a[i];
        }
    }
    return len;//返回长度
}
int er_search(int w)
{
    int left=0,right=len-1;
    int mid;

    while(left <= right){
        mid = (left+right)/2;
        //左右逼近,获得下标
        if(DP[mid]>w)    right = mid-1;
        else if(DP[mid]<w)   left = mid + 1;
        else return mid;
    }
    return left;//由于与数组左边比较,所以返回左下标
}

跟老菜鸟学python

-
  • 1970年01月01日 08:00

动态规划求最长递增子序列(longest increasing subsequence)

1,什么是动态规划? 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。当然,各个阶段决策的选取不是任意...
  • zzuchengming
  • zzuchengming
  • 2015-11-04 22:00:28
  • 1386

动态规划求最长递增子序列

最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能...
  • qq_21120027
  • qq_21120027
  • 2015-08-18 18:37:24
  • 2346

最长递增子序列动态规划求解和利用二分查找去优化动态规划,优化成n*logn

自从保研后,就找个兼职做财务,闲的时候就看各种技术贴和面经,发现想进大型互联网公司,算法和数据结构就必须过关了。借用左神说的,国内好公司爱考算法和数据结构,国外互联网公司几乎只考算法和数据结构。所以我...
  • u014574317
  • u014574317
  • 2017-01-03 15:21:58
  • 528

动态规划算法之最长递增子序列问题

一、问题描述 在数字序列A中,按下标递增的顺序选出一个子序列B,如果选出的子序列B是严格递增的,则该子序列B称为原数字序列A的递增子序列。最长递增子序列问题就是找到原数字序列A中最长的递增子序列。例如...
  • tterminator
  • tterminator
  • 2016-03-22 19:18:11
  • 6418

动态规划之最长递增子序列(Longest Increasing Subsequence)

原文地址:http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/ We have...
  • sinat_36246371
  • sinat_36246371
  • 2016-10-13 12:12:37
  • 1136

动态规划:最长单调递增子序列

  • 2012年05月28日 21:27
  • 583B
  • 下载

动态规划——最长递增子序列和最长公共子序列

(1)最长递增子序列 一个序列有n个数:a[1],a[2],…,a[n],求出最长递增子序列的长度。 比如说对于测试数据5,3,4,8,6,7来说: 第一个数字5,d[0] = 1 第一个数字3,...
  • hulamua
  • hulamua
  • 2016-09-14 16:18:52
  • 2663

动态规划——最长递增子序列

一,问题描述设L=a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=aK1,ak2,…,akm>,其中k12m且aK1k2km。求最大的m值。二,问题求解方法一:转化...
  • clearriver
  • clearriver
  • 2009-05-23 18:40:00
  • 5925

Java-LIS最长递增子序列(动态规划实现)

问题:找出给定数组最长且单调递增的子序列。         解决思路:原数组arr的子序列顺序保持不变,而且排序后的array本身是递增的。这样得到的两个序列的子序列一定是递增的序列。要求出数组ar...
  • qq_30507287
  • qq_30507287
  • 2016-10-16 19:41:12
  • 1420
收藏助手
不良信息举报
您举报文章:【菜鸟er】动态规划_最长递增子序列
举报原因:
原因补充:

(最多只允许输入30个字)