4、最长递增子序列LIS--Java代码
来源:互联网 发布:mafia3 mac 编辑:程序博客网 时间:2024/06/15 15:38
求最长递增子序列,并打印所有最长子序列,直接贴代码:
package algorithm.basic;import java.util.ArrayList;import java.util.List;/** * LIS:最长递增子序列 * @author baolibin */public class _04_LIS {public static void main(String[] args) {System.out.println("测试一:所有递增序列遍历:");int[] tmpNum={23,9,15,40,7,41,3,1,5};lcs lcs = new lcs(tmpNum);lcs.countLIS();lcs.printAll(); //输出结果System.out.println("\n\n测试二:所有递增序列遍历:");int[] tmpNum2={123,23,345,45,678,78,1,2,3};lcs lcs2 = new lcs(tmpNum2);lcs2.countLIS();lcs2.printAll(); //输出结果System.out.println("\n\n测试三:所有递增序列遍历:");int[] tmpNum3={123,23,345,45,678,78,1,2,3,89};lcs lcs3 = new lcs(tmpNum3);lcs3.countLIS();lcs3.printAll(); //输出结果}}class lcs{private int[] tmpNum; //数组private int[] lcsNum; //存储所有的递增序列private int[] selectNum; //存储递增序列下标, 当前某元素存储的上前一个元素的下标值,遍历会用private int max; //存储最长递增序列的长度 maxlengthprivate int maxIndex; //存储最长递增子序列的下标 遍历所有序列用不到这个变量,遍历其中一个可以用这个,没太多卵用private List<Integer> list;/** * 构造方法 * @param tmpNum 待操作的数组 * @param lcsNum LIS数组存储当前每个点的最长递增序列长度 * @param selectNum 存储当前元素递增序列的上一个元素下标 * @param max 最长递增序列的长度 */public lcs(int[] tmpNum) {this.tmpNum = tmpNum;lcsNum=new int[tmpNum.length];selectNum=new int[tmpNum.length];for (int i = 0; i < tmpNum.length; i++) {lcsNum[i]=1;selectNum[i]=-1;}this.max = 0;maxIndex=0;list=new ArrayList<Integer>();}/** * 计算最长递增子序列 */public void countLIS(){for(int i=1;i<tmpNum.length;i++){for (int j = 0; j < i; j++) { //遍历当前i节点 之前的节点if (tmpNum[j]<=tmpNum[i]) { //把当前节点的,之前所有小于当前节点的元素,的最长递增长度,赋值给当前元素if (lcsNum[i]<lcsNum[j]+1) { //当前节点的递增子序列长度+1lcsNum[i]=lcsNum[j]+1;selectNum[i]=j; //当前几点的递增子序列的上一个节点是j}}}if (max<lcsNum[i]) { max=lcsNum[i]; //更新整个数组最长递增子序列的最大值maxIndex=i; //最长递增子序列的结尾下标值}}}/** * 打印最长递增子序列,只会打印其中一个 * @param selectNum * @param maxIndex */public void print(){System.out.print("原数组为:");for (int i = 0; i < tmpNum.length; i++) {System.out.print(tmpNum[i]+"、");}System.out.print("\n最长递增子序列的长度为:"+max);int current=maxIndex;while (current>=0) {list.add(tmpNum[current]);current=selectNum[current];}System.out.print("\n最长递增子序列之一为:");for (int i = list.size()-1; i>=0; i--) {System.out.print(list.get(i)+"、");}System.out.print("\nLIS数组为:");for (int i = 0; i < lcsNum.length; i++) {System.out.print(lcsNum[i]+"、");}}/** * 打印所有的最长递增子序列 */public void printAll(){System.out.print("原数组为:");for (int i = 0; i < tmpNum.length; i++) {System.out.print(tmpNum[i]+"、");}System.out.print("\nLIS数组为:");for (int k = 0; k < lcsNum.length; k++) {System.out.print(lcsNum[k]+"、");}System.out.print("\n最长递增子序列的长度为:"+max);for (int i = lcsNum.length-1; i >=0; i--) { //从selectNum后开始,selectNum数组所有等于最长序列长度的都遍历if(lcsNum[i]==max){ //进行一次最长递增数组的遍历list.clear();//清空当前最长递增子序列存储空间int maxcurrent=i;while (maxcurrent>=0) {list.add(tmpNum[maxcurrent]);maxcurrent=selectNum[maxcurrent];}System.out.print("\n最长递增子序列之一为:");for (int j = list.size()-1; j>=0; j--) {System.out.print(list.get(j)+"、");}}list.clear(); //清空当前最长递增子序列存储空间}}}
运行结果截图:
1 0
- 4、最长递增子序列LIS--Java代码
- LIS 最长递增子序列 Java实现
- 最长递增子序列 LIS
- 最长递增子序列(LIS)
- 最长递增子序列(LIS)
- 最长递增子序列LIS
- 最长递增子序列LIS
- 最长递增子序列(LIS)
- 最长递增子序列LIS
- 最长递增子序列 LIS
- LIS(最长递增子序列)
- LIS-最长递增子序列
- 最长递增子序列LIS
- 最长递增子序列LIS
- Java-LIS最长递增子序列(动态规划实现)
- LIS-最长递增子序列的长度-java
- 动态规划4:LIS最长递增子序列问题
- 最长递增子序列问题((LIS))
- Git学习(三)--本地仓库和GitHub推送与克隆
- Python3 基础语法
- CF 709D 数学,构造
- .Net框架搭建之1、SQL Server EF MVC简单三层框架
- MySQL 复制过滤详解
- 4、最长递增子序列LIS--Java代码
- 蚁群算法优化
- ARM基础教程复习
- CPU占用率
- 动态规划-----换钱
- ARM技术社区_ARM学习资料汇总
- VS2008开发WinCE程序编译速度慢的解决办法
- 偏执却管用的10条Java编程技巧
- java加密解密初探-RSA