poj2533

来源:互联网 发布:吉利知豆电动汽车租赁 编辑:程序博客网 时间:2024/05/17 23:04
设计算法:dp+LIS
题目大意给定一个序列A={a1,a2,…,an},现在要求出A的一个最长上升子序列的长度

代码如下:
import java.util.Scanner;public class Main_2533 {static int n;//序列的长度static int[] a;//a[i]:序列的第i个值static int[] dp;//dp[i]:以a[i]结尾的序最长子序列的长度public static void main(String[] args) {Scanner in=new Scanner(System.in);n=in.nextInt();a=new int[n+1];dp=new int[n+1];b=new int[n+1];for(int i=1;i<=n;i++){a[i]=in.nextInt();}dp2();}//ACstatic void dp(){dp[1]=1;int max=1;for(int i=2;i<=n;i++){dp[i]=1;for(int j=1;j<i;j++){if(a[i]>a[j]){if(dp[i]<dp[j]+1){dp[i]=dp[j]+1;}}}if(dp[i]>max){max=dp[i];}}System.out.println(max);}//ACstatic int[] b;static void dp2(){b[1]=a[1];int m=1;for(int i=2;i<=n;i++){if(a[i]>b[m]){m++;b[m]=a[i];}else {int j=m-1;while(a[i]<=b[j]){j--;}//b[i]<a[i]<=b[j+1];b[j+1]=a[i];} }System.out.println(m);}}


0 0
原创粉丝点击