是一道简单的最长上升子序列问题
用下面的dp代码就可以轻松解决。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 int dp[1005],num[1005]; 8 9 int main() 10 { 11 int n,ans; 12 scanf("%d",&n); 13 ans=0; 14 for(int i=0;i<n;i++) 15 { 16 scanf("%d",&num[i]); 17 dp[i]=1; 18 for(int j=0;j<i;j++) 19 { 20 if(num[i]>num[j]) 21 dp[i]= dp[i] > dp[j]+1 ? dp[i] :dp[j]+1; 22 } 23 ans=dp[i] >ans ? dp[i] :ans; 24 } 25 printf("%d\n",ans); 26 return 0; 27 }
相同类型的问题
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134
这个连接上的最长递增子序列问题用上面的代码就会TLE
因为这个题目的数据不小,没有优化的dp就很容易T掉
下面给出优化后的代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <iostream>
#define inf 0x3f3f3f3f
#define Max 1000500
using namespace std;
int dp[Max],a[Max];
void solve(int n)
{
for(int i=0;i<n;i++)
{
dp[i]=inf;
}
for(int i=0;i<n;i++)
{
*lower_bound(dp,dp+n,a[i])=a[i];///返回一个指针
}
printf("%d\n",lower_bound(dp,dp+n,inf)-dp);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
solve(n);
return 0;
}