问题

给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4.

解决方案:

1,新建一个二维数组ret[ ][ ];以数组A[ ]= {2 , 1 , 5 , 9}为例:

~   2   1   5   9

0        0   0   0   0   0     //为了方便计算,第0行第0列均设为0

1        0   2   1   1   1

2        0        E   5   5     //第2行表示子串长度为2,该位置及前面元素的长度为2的最长递增子序列

3        0             E   9     //E表示该位置往前都没有产度为3的递增子序列

4        0                  E

原理是:

1.长度为k的子串是否是递增子串与长度为k-1的子串是否是递增子串有关;

2.ret[2][3]=5

2表示:行号为2表示子串长度为2;

3表示:位于第3列的数字5=A[2];

5表示:位于第3列的数字5和其前面的各数,如果能组成长度为2的递增子序列,则在该位写                     min(所有可行序列的最大值)比如  123 和 125两个序列最大值分别为3和5,写入3;如                   果不能组成长度为2的递增序列,则写入ret[i][j]左侧数字,如果左侧为0或E则输入E;

3.如果第k行全都是E,表示改行起没有满足条件的递增子序列,则k-1为最长递增子序列的长度;

#include<stdlib.h>
#include<stdio.h>
#define MAX 100 int ret[MAX][MAX]={{}};
int FUN(int inp[],int len){
int i=;//第0行全0
int maxlen=;
int ERROR=0xfff;
int isfinished;
for(;i<=len;i++){
int j=i;
for(;j<=len;j++){
isfinished=;//结束标志位
if(ret[i-][j-] != ERROR){
if(inp[j-]>ret[i-][j-]) ret[i][j]=inp[j-];
else{
ret[i][j]=ERROR;
}
}//与左上角数比较,大于填inp,小于时不能组成递增序列填ERROR
else ret[i][j] = ERROR;//左上角数为ERROR时不可组成递增序列
if(ret[i][j-] !=ERROR && ret[i][j-] != ){
if(ret[i][j-]<ret[i][j]) ret[i][j]=ret[i][j-];
}//左侧数不为0或ERROR时,填入左侧数和该数较小者
printf("ret[%d][%d]=%d\n",i,j,ret[i][j]);
if(ret[i][j] != ERROR) isfinished = ;//如果还非ERROR数字表示未结束
}
if(isfinished == ){//结束后保存结束时数组行数
maxlen = i-;
break;
}
}
return maxlen;
} int main(){
int input[]={,,,,,,,};
int result = FUN(input, sizeof(input)/sizeof(int));
printf("result is:%d\n",result);
return ;
}

输出结果:

xu@xu-ThinkPad-X61:~/algorithm$ gcc maxascent1.c
xu@xu-ThinkPad-X61:~/algorithm$ ./a.out
ret[1][1]=5
ret[1][2]=5
ret[1][3]=5
ret[1][4]=1
ret[1][5]=1
ret[1][6]=1
ret[1][7]=1
ret[1][8]=1
ret[2][2]=6
ret[2][3]=6
ret[2][4]=6
ret[2][5]=2
ret[2][6]=2
ret[2][7]=2
ret[2][8]=2
ret[3][3]=7
ret[3][4]=7
ret[3][5]=7
ret[3][6]=7
ret[3][7]=3
ret[3][8]=3
ret[4][4]=4095
ret[4][5]=4095
ret[4][6]=8
ret[4][7]=8
ret[4][8]=4
ret[5][5]=4095
ret[5][6]=4095
ret[5][7]=4095
ret[5][8]=4095
result is:4

希特,差点绕进去了!!

最长递增子序列(Longest Increase Subsequence)的更多相关文章

  1. 最长递增子序列(Longest increasing subsequence)

    问题定义: 给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续). 这道题共3种解法. 1. 动态规划 动态规划的核心是状态的定义和状态转移方程.定义lis(i),表示前i个数中以A[ ...

  2. 【转】动态规划:最长递增子序列Longest Increasing Subsequence

    转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...

  3. 算法实践--最长递增子序列(Longest Increasing Subsquence)

    什么是最长递增子序列(Longest Increasing Subsquence) 对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5 ...

  4. 300最长上升子序列 · Longest Increasing Subsequence

    [抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...

  5. [Swift]LeetCode300. 最长上升子序列 | Longest Increasing Subsequence

    Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...

  6. [Swift]LeetCode594. 最长和谐子序列 | Longest Harmonious Subsequence

    We define a harmonious array is an array where the difference between its maximum value and its mini ...

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

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

  8. 动态规划--最长上升子序列(Longest increasing subsequence)

    前面写了最长公共子序列的问题.然后再加上自身对动态规划的理解,真到简单的DP问题很快就解决了.其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了.不错不错~加油 题目描述: ...

  9. 最长公共子序列(Longest common subsequence)

    问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子序列.(子序列中的字符不要求连续) 这道题可以 ...

随机推荐

  1. 处理器(CPU)调度问题

     因为处理器是最重要的计算机资源,提高利用率并提高系统性能的处理器(吞吐量.响应时间).于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之中的一个. 一.处理机调度的层次 1. ...

  2. CENTOS6.4安装lxml失败

    环境如下: Centos6.4 Python 2.7.6 pip install lxml 执行上面的命令,有类似下面的提示: src/lxml/lxml.etree.c:188133: error: ...

  3. 前端学习笔记(zepto或jquery)——对li标签的相关操作(三)

    对li标签的相关操作——八种方式遍历li标签并获取其值 $("ul>li").forEach(function(item,index){ alert(index+" ...

  4. Petroglyph访问:中间件游戏

    Xsolla有幸与Petroglyph的总裁及创始人Michael Legg进行了对话. 这是及时战略游戏中对主要一家公司. 由前Westwood的员工 创办,还设计了一块新的RTS游戏-Grey G ...

  5. asp.net 一般处理程序session 为 null

    必须继承  IRequiresSessionState  接口才行!

  6. 安装ruby on rail

    安装: # nvm 安装, 两种方法 $ curl https://raw.githubusercontent.com/creationix/nvm/v0.8.0/install.sh | sh $ ...

  7. Unity3D-RPG项目实战(3):整合Visual Studio 2013开发环境

    古人云:工欲善其事必先利其器,IDE尽管属于一个非常上层的工具,可是一个好的IDE对工作效率提高还是非常大的. 事实上我还是满想用一下官方推荐的Mono,毕竟跨平台如今还是非常重要的一个特性.尝试了这 ...

  8. 玩转Web之servlet(四)---B/S是怎样使用http协议完毕通信过程的

    在上一篇文章中,我简单的说了一下B/S架构的流程图,关于浏览器和server之间的通信过程知识含糊的说了一下,在这篇文章中我再总结一下B/S架构里是怎样利用http协议去完毕通信的. (一)通讯过程 ...

  9. Cf 444C DZY Loves Colors(段树)

    DZY loves colors, and he enjoys painting. On a colorful day, DZY gets a colorful ribbon, which consi ...

  10. 从一道数学题弹程序员的思维:数学题,求证:(a+b%c)%c=(a+b)%c

    在学校论坛看到这道题目,全忘了的感觉. 如果你是高中的,那我觉得你完全没问题.但是,在这个博客园的圈子,觉得全部人都是程(ban)序(zhuan)员(gong)相关的人员,解决这个问题有点难度,毕竟, ...