设计算法:dp+LIS
题目大意给定一个序列A={a1,a2,…,an},现在要求出A的一个最长上升子序列的长度
代码如下:
题目大意给定一个序列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();
}
//AC
static 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);
}
//AC
static 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);
}
}