【动态规划】和最大子序列

本文介绍了一种使用动态规划解决最长上升子序列问题的方法,并提供了一个O(n^2)复杂度的示例代码实现。

【动态规划】最长上升子序列

此题为动态规划算法题,题目来源计科老班

题目描述

给出一个由n个数组成的序列A[1…n],求最长单调上升子序列(LIS)的长度。LIS即求最大的一个子序列长度m,使得a1<a2<……<am且A[a1]<A[a2]<……<A[am]。

输入

两行:

第1行:整数n (1<=n<=1000)

第2行:n个整数 (int范围内),空格隔开。

输出

一行:一个整数,即最长上升子序列长度。

样例输入

10
63 11 21 36 28 20 57 37 82 4

样例输出

5

思路详解

此题数据庞大,应该采用动态规划,将原问题分解为若干个子问题,先求解子问题,然后从这些子问题得解得到原问题的解。
此处提供O(n*n)复杂度算法。这道题,将j从第二个数开始循环,算出每一个j作为子序列最后一个数的最优子解。将j前的最长上升子序列记为L(i),则如果A(j)>A(i),则j上的最长上升子序列为L(i)+1;算出所有的结果,最终取最大值,则max{L(i)+1|0<=i<=j}

代码

import java.util.Scanner;

public class LIS1556 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n,max;
		int[] A,L;
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		A=new int[n];
		L=new int[n];
		L[0]=1;
		max=0;
		for(int i=0;i<n;i++) A[i]=sc.nextInt();
		
		for(int j=1;j<n;j++) {
			L[j]=1;
		    for(int k=0;k<j;k++) {
		    	if( A[j]>A[k] && L[k]+1>L[j])
		    		L[j] = L[k]+1;
		    }	    
		}
		for(int a:L)if(a>max)max=a;
		System.out.println(max);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值