您的位置:首页 > 其它

poj2533

2016-03-07 15:17 471 查看
设计算法: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();
}

//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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: