问题描述:给n个数,找出最长子序列并输出
问题分析:本题是DAG(有向无环图)最长路问题,设d[i]为以i结尾的最长链的长度,则状态转移方程为:d[i]=max{0,d[j]|j<i && A[j]<A[i]}+1 ;
solve one: 这里用map[i][j]存储第i个和第j个的关系0-1邻接矩阵;套用标准解DAG的模板,利用dfs求解
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1000+5 int d[maxn],n,map[maxn][maxn]; //d[]用来存储以i结尾的最大长度,map[i][j]满足要求OK()关系的邻接矩阵
int A[maxn]; bool ok(int i,int j){
return j<i && A[j]<A[i];
} int dfs(int cur) //深搜,记忆化搜索
{
if( d[cur] > ) return d[cur];//已经找过的直接输出
d[cur] = ; //没找的先付初值1,然后深搜寻找
for(int i=;i<=n;i++)
{
if( map[cur][i] && d[cur] < dfs(i)+)
{
d[cur] = dfs(i)+;
}
}
return d[cur];
}
void out(int i) //反向追踪找到选取图形的标号
{
for(int j=;j<=n;j++)
{
if( map[i][j] && d[i] == d[j]+)
{
out(j);
break;
}
}
cout << A[i]<< " ";//放在上面是倒着输出,下面是睁着输出
} int main(){ for(;cin>>n && n;){ int i,j; for(i=;i<=n;i++){ //输入
cin>>A[i];
} memset(map,,sizeof(map)); //构造一个ok关系的0-1邻接矩阵
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(ok(i,j))
map[i][j]=; memset(d,,sizeof(d)); //深搜记忆化完成d[]表
for(i=;i<=n;i++){
dfs(i);
} int max=,ds; //找出d[]的最大值并用ds存储尾链位置
for(i=;i<=n;i++){
if(max<d[i]){
max=d[i];
ds=i;
}
} cout<<max<<'\n';
out(ds);cout<<'\n';
}
return ;
}
solve two:正向求解,边输边计算d[]的值
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1000+5
#define INF 1<<31
int A[maxn],d[maxn],n;
void out(int i) //反向追踪找到选取图形的标号
{
for(int j=;j<=n;j++)
{
if(i>j && A[i]>A[j] && d[i] == d[j]+)
{
out(j);
break;
}
}
cout <<A[i]<< " ";
} int main(){
int i,j;
while(cin>>n){
memset(d,,sizeof(d)); int maxx=-INF,ds;
for(i=;i<=n;i++){
cin>>A[i]; int max=-INF;
for(j=;j<i;j++)
if(A[i]>A[j] && max<d[j])
max=d[j];
d[i]=(max==-INF ? : max+); if(maxx<d[i]){maxx=d[i];ds=i;}
} cout<<maxx<<'\n';
out(ds);
cout<<'\n';
}
}

[ACM_动态规划] 最长上升子序列(LIS)的更多相关文章

  1. 动态规划——最长上升子序列LIS及模板

    LIS定义 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1 ...

  2. 算法之动态规划(最长递增子序列——LIS)

    最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...

  3. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  4. 动态规划-最长上升子序列(LIS)

    时间复杂度为〇(nlogn)的算法,下面就来看看. 我们再举一个例子:有以下序列A[]=3 1 2 6 4 5 10 7,求LIS长度. 我们定义一个B[i]来储存可能的排序序列,len为LIS长度. ...

  5. 动态规划--最长上升子序列(LIS)的长度

    l例如:对于[3,1,4,2,5],最长上升子序列的长度是3 arr = [3,1,4,5,9,2,6,5,0] def lis(arr): #dp[i]表示第i个位置的值为尾的数组的最长递增子序列的 ...

  6. 动态规划(DP),最长递增子序列(LIS)

    题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...

  7. nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)

    最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n).  具体分析参考:http://b ...

  8. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

  9. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

随机推荐

  1. interactivePopGestureRecognizer

    苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecogni ...

  2. QQ在线客服JS代码,自适应漂浮在网页右侧

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  3. [转]为什么使用 Redis及其产品定位

    原文链接:http://www.infoq.com/cn/articles/tq-why-choose-redis 传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据 ...

  4. jsp页面格式时间yy-mm-dd

    这个问题把我花了1小时都没弄出来  各种报错  还是最后同学告知才知道的. 导入  :<%@ taglib uri="http://java.sun.com/jsp/jstl/func ...

  5. 基于 Winform + DotNetBar 写的股市行情助手

    StockViewer 股市行情助手 简介 观看股市行情,窗口太显眼,是否担心被身后的老板发现? 窗口来回切换,工作时每隔几分钟就要看一眼股市.难道只能同时做一件事情吗? 现在,一款完全免费.开源的小 ...

  6. CentOS 7编译安装gcc5.3碰到的坑

    下载最新的iso安装完毕后,发现gcc还是4.8版本的,就考虑升级到5.x 参考这个帖子 基本也没啥,但是执行download_prerequisites 时简直坑爹,三个压缩包都不超过2M 反复尝试 ...

  7. ubuntu安装erlang

    照着园子里一篇博文安装erlang,各种错调不出来.最后发现官网有解决方案: https://www.erlang-solutions.com/downloads/download-erlang-ot ...

  8. PhoneGap(二维码扫描 )

    关于 phoneGap 如何做 二维码扫描 1.        先配置好, 环境 http://coenraets.org/blog/cordova-phonegap-3-tutorial/http: ...

  9. python-getattr

    getattr(object, name[, default]) Return the value of the named attribute of object.  name must be a ...

  10. mysql 备份软件 Xtrabackup 的 xtrabackup_binlog_pos_innodb和xtrabackup_binlog_info 文件区别

    今天在操作 innobackupex 的时候,执行 change master to 的时候发现  xtrabackup_binlog_pos_innodb   xtrabackup_binlog_i ...