第二篇给lis。
o(n^2):
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,arr[111],dp[111];
int main()
{
while(~scanf("%d",&n))
{
int i,j,maxm=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
dp[i]=1;
}
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(arr[i]>arr[j]&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
}
}
maxm=max(maxm,dp[i]);
}
printf("%d\n",maxm);
}
return 0;
}
o(nlogn):
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,arr[111],dp[111];
int main()
{
while(~scanf("%d",&n))
{
int i,j,l=1,index;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
dp[1]=arr[0];
for(i=1;i<n;i++)
{
if(arr[i]>dp[l])
{
dp[++l]=arr[i];
}
else
{
index=lower_bound(dp,dp+n,arr[i])-dp;
dp[index]=arr[i];
}
}
printf("%d\n",l);
}
return 0;
}
o(n^2)+输出路径:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,arr[111],dp[111],pre[111],ans[111];
int main()
{
while(~scanf("%d",&n))
{
int i,j,maxm=0,ans_i,k=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
dp[i]=1;
pre[i]=-1;
}
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
if(arr[i]>arr[j]&&dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
pre[i]=j;//保存前驱
}
}
if(maxm<dp[i])
{
maxm=dp[i];
ans_i=i;
}
}
printf("%d\n",maxm);
do
{
ans[k++]=arr[ans_i];
ans_i=pre[ans_i];
}while(ans_i!=-1);
for(i=k-1;i>=0;i--)
{
printf("%d ",ans[i]);
}
puts("");
}
return 0;
}