问题

给定一个长度为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

希特,差点绕进去了!!

最新文章

  1. webapi 中的本地登录
  2. react.js 多个组件集成示例
  3. 再次实操一次angular的基本语法
  4. 16 shell调试技术
  5. Android APP的安装路径
  6. jquery判断div是否显示或者隐藏
  7. 一个简单方法:构造xml的document,并将其转换为string
  8. C++ 动态库导出函数名“乱码”及解决
  9. maven下载,安装与eclipse中maven配置
  10. Jquery Mobile表单
  11. CSVN部署安装,实现web管理svn
  12. day 23 网络编程
  13. 使用json-server模拟REST API
  14. Java三大特性:封装,继承,多态
  15. Win32+API学习笔记:创建基本的窗口控件
  16. 无法在线安装Genymotion Eclipse插件,显示”There are no categoryzed items“
  17. How to Pronounce ‘to the’ in a Sentence
  18. 时间选择器(TimePicker)
  19. maven中跳过单元测试(转)
  20. Service由浅到深——AIDL的使用方式

热门文章

  1. Android研究之游戏开发处理按键的响应
  2. iOS定义自己的回报button(它不影响返回手势)
  3. Oracle内存管理(五)
  4. 【MongoDB数据库】Java MongoDB CRUD Example
  5. Struts2 整合jQuery实现Ajax功能(2)
  6. JS开发调试
  7. java中IO写文件工具类
  8. 深入struts2.0(五)--Dispatcher类
  9. CSS3+HTML5特效5 - 震动的文字
  10. 安卓WindowManager注入事件如何跳出进程间安全限制