POJ 2533 Longest Ordered Subsequence (LIS DP)

时间:2023-03-10 05:44:46
POJ 2533 Longest Ordered Subsequence  (LIS DP)

最长公共自序列LIS

三种模板,但是邝斌写的好像这题过不了

N*N

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = ;
int a[],dp[],n;
int Lis(){
dp[]=;
int ans=;
int temp=;
for(int i=;i<=n;i++){
temp=;
for(int j=;j<i;j++){
if(dp[j]>temp&&a[i]>a[j]){
temp=dp[j];
}
}
dp[i]=temp+;
if(dp[i]>ans){
ans=dp[i];
}
}
return ans;
}
int main(){
while(~scanf("%d",&n)){
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
printf("%d\n",Lis());
}
return ;
}

N*logn

 #include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std; int a[],dp[],c[],n; int bin(int sizee,int k)
{
int l = ,r = sizee;
while(l<=r)
{
int mid = (l+r)/;
if(k>c[mid] && k<=c[mid+])
return mid+;
else if(k<c[mid])
r = mid-;
else
l = mid+;
}
} int LIS()
{
int i,j,ans=;
c[] = a[];
dp[] = ;
for(i = ; i<=n; i++)
{
if(a[i]<=c[])
j = ;
else if(a[i]>c[ans])
j = ++ans;
else
j = bin(ans,a[i]);
c[j] = a[i];
dp[i] = j;
}
return ans;
} int main()
{
int i;
while(~scanf("%d",&n))
{
for(i = ; i<=n; i++)
scanf("%d",&a[i]);
printf("%d\n",LIS()); }
return ;
}

没有AC

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define clc(a,b) memset(a,b,sizeof(a))
#define LL long long
#include<cmath>
const int inf=0x3f3f3f3f;
using namespace std;
const int MAXN=;
int a[MAXN],b[MAXN];
int Serch(int num,int low,int high) {
int mid;
while(low<=high) {
mid=(low+high)/;
if(num>=b[mid])
low=mid+;
else high=mid-;
}
return low;
}
int Dp(int n) {
int i,len,pos;
b[]=a[];
len=;
for(i=; i<=n; i++) {
if(a[i]>=b[len]) {
len=len+;
b[len]=a[i];
} else {
pos=Serch(a[i],,len);
b[pos]=a[i];
}
}
return len;
} int main() {
int n;
while(~scanf("%d",&n)) {
for(int i=; i<=n; i++)
scanf("%d",&a[i]);
printf("%d\n",Dp(n));
}
}