链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257
http://acm.nyist.net/JudgeOnline/problem.php?pid=214(代码大同小异,不再赘述,但要注意时间复杂度)
源代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
#define N 1000
int array[N];
int dp[N];
int LIS(int n,int dp[],int array[]);
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,length;
for(i=1;i<=n;i++)
cin>>array[i];
length=LIS(n,dp,array);
printf("%d\n",length);
}
return 0;
}
int LIS(int n,int dp[],int array[])
{
int i,j,ans;
for(i=2;i<=n;i++)
dp[i]=0;
dp[1]=1;
for(i=2;i<=n;i++)
{
ans=dp[i];
for(j=1;j<i;j++)
{
if(array[i]>array[j]&&dp[j]>ans)
ans=dp[j];
}
dp[i]=ans+1;
}
ans=0;
for(i=1;i<=n;i++)
if(dp[i]>ans)ans=dp[i];
return ans;
}
最长上升子序列(时间复杂度为n*logn
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
#define N 1000
int b[N];
int array[N];
int search(int temp,int k);
int LIS(int n);
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,k=1;
for(i=1;i<=n;i++)
cin>>array[i];
int count=LIS(n);
printf("%d\n",count);
}
return 0;
}
int search(int temp,int k)
{
int low=1;
int high=k;
while(low<=high)
{
int middle=(low+high)/2;
if(temp>=b[middle])low=middle+1;
else high=middle-1;
}
return low;
}
int LIS(int n)
{
int i,k=1;
b[1]=array[1];
for(i=2;i<=n;i++)
{
if(array[i]>b[k])b[++k]=array[i];
else
{
int pos=search(array[i],k);
b[pos]=array[i];
}
}
return k;
}