动态规划之LIS最长上升子列问题 java实现

题目如下 :

      在一个子串中任意取N项,要求这N项是递增的,求出这个串中这样的N的最大值,注意这样的最长子列不一定是唯一的,例如在 2 1 5 3 6 4 6 3 中就有1 3 4 6 和2 3 4 6两种,都是4。

   本题可以这么考虑,可以从头开始往后求,设置一个一维数dp组来保存以每一项为结尾的最长子列数目,第一项的肯定是1,后面的第i项只要往前扫描,假如第j项值比我第i项的值小或者等于第i项,那么以第i项为结尾的最长子列数目就是max(dp[i],dp[j]+1),一直这么求直到最后一项n,那么整个串中最长上升子列数目就是dp[n]了,

所以代码如下:

    

import java.util.*;
public class LIStest {
   public static void main(String[] args){
	   Scanner sc = new Scanner(System.in);
	   int n = sc.nextInt();
	   int[] datas = new int[n];
	   int[] max = new int[n];
	   int result = 0;
	   for(int i=0;i<n;i++){
		   datas[i] = sc.nextInt();
		   max[i] = 1;
	   }
	   for(int i=0;i<n;i++){
		   for(int j=0;j<i;j++){
			   if(datas[j]<=datas[i]){
				   max[i] = max(max[i],max[j]+1);
			   }
		   }
		   result = max(result,max[i]);
	   }
	   System.out.print(result);
   }
   public static int max(int a,int b){
	   if(a>b){
		   return a;
	   }else{
		   return b;
	   }
   }
}

结果如下 :

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值