是一道简单的最长上升子序列问题
用下面的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; }