动态规划——最长上升子序列
2016-05-19 10:29
453 查看
题目描述:求出一个数组最长上升子序列长度。
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).长度为4.
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).长度为4.
//递归方法:找出递推公式,即DP的状态转移方程。 //k表示以data[k]结尾,mostLength求以以data[k]结尾的最长上升子序列的长度。 public int mostLength(int []data,int k) { if(k == 0) return 1; int max=0; for(int i=0;i<k;i++) { if(data[i]<data[k]) { if(mostLength(data,i)>max) { max=mostLength(data,i); } } } return max+1; }
//自底向上的方法 //定义一个数组lengh,length[i]用来存放以data[i]结尾的最长上升子序列的长度; public void mostLength_DP(int []data) { int []length=new int[data.length]; length[0]=1; for(int i=1;i<data.length;i++) { int temp=0; for(int j=0;j<i;j++) { if(data[j]<data[i]) { if(temp<length[j]) { temp=length[j]; path[i]=j;//path[i]存放最大上升序列本次i的前一个数的下标j; } } } length[i]=temp+1; } System.out.println(Arrays.toString(length)); }
//构造最优解: //用一个数组存放最优解下标; int path[]=new int[15]; public void path_trace(int[] data,int []path,int k)//k为当前所需打印的值的下标; { if(k == 0) { System.out.print(data[k]); return ; } path_trace(data,path,path[k]);//path[k]为序列中前一个数字的下标; System.out.print(data[k]); }
相关文章推荐
- animation实现动画效果
- 照相机定标
- 软件开发模式介绍和对比(瀑布、迭代、敏捷等)
- spring 缓存
- mysql 主从同步故障解决 Error 'Row size too large (> 8126).
- 【转载】CSS3 filter:drop-shadow滤镜与box-shadow区别应用
- android——adb shell——netcfg——get IP address
- 面试题49:把字符串转换成整数
- OKHttp简单使用
- 华为OJ做题记录(包含题目和ac代码)
- 关于Wifi下自动离线最新的文章缓存
- .NET MVC实现多图片上传并附带参数(ajaxfileupload)
- python2.7下同步华为云照片的爬虫程序实现
- svn代码量统计工具StatSVN的使用
- Mysql主从配置,实现读写分离
- 【bzoj2844】albus就是要第一个出场 高斯消元
- oracle(行转列)中有关case和decode的用法及比较
- android动画之初学
- UI基础 获取当前屏幕显示的viewcontroller
- hive中的NULL(hive空值处理)