最长递增子序列粗解
带来了两个比较经典的求解最长递增子序列的题目
①点击打开链接 51nod 1134
第1行:1个数N,N为序列的长度(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
输出最长递增子序列的长度。
8
5
1
6
8
2
4
5
10
5
最近在看动态规划 求解最长递增子序列有两种方法 一种是O(n^2) 一种是O(n^log(n))
对于这个题目只能用后者否则后几个例子会超时,但是这种办法只能求长度,求出来的顺序是不对的,贴上代码解释下。
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define s(n) scanf("%d",&n)
#define p(n) printf("%d",n)
using namespace std;
int N[50050];
int dp[50050];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
scanf("%d",&N[i]);
int top=1;
dp[1]=N[1];
for(int i=2;i<=n;i++)
{
if(N[i]dp[top])//找到当前一个最大的数
dp[++top]=N[i];
else//介于最小和最大之间的数字
{
int b=1,e=top;
while(b
本方法就是不断更新对应位置的数字,比如 1 7 8 4 5 6
刚开始dp[1]=1 dp[2]=7 dp[3]=8 到了4的时候通过二分法找到了dp[2]>4 所以dp[2]=4,dp[3]=5,dp[4]=6; 通过这样的方式来更新,达到了二分 降低了复杂度。
②点击打开链接 POj2533
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 54723 | Accepted: 24522 |
Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4也是求最长递增序列,没啥解释的,直接贴代码。
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define s(n) scanf("%d",&n)
#define p(n) printf("%d",n)
using namespace std;
int N[1050];
int dp[1050];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=0;idp[i])
{
dp[i]=dp[j]+1;
maxx=max(maxx,dp[i]);
}
}
}
printf("%d\n",maxx);
}
return 0;
}
二层for循环 查找更新