求最长上升子序列的长度—dp
题目描述:
求最长上升子序列的长度:【注意是连续的子序列】
比如:34125609
最长的子序列为:34569或者12569(答案不唯一),所以结果是5
第一种解法:dfs【时间可能长一些】
//最长上升子序列
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int ans;
int n;
int a[105];
void dfs(int index,int len,int end)//搜索到第index个数,序列末尾的数是end,len为长度
{
if(index==n)
{
ans=max(ans,len);
return ;
}
if(a[index]>end)
dfs(index+1,len+1,a[index]);
dfs(index+1,len,end);
}
int main()
{
int i;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}
第二种解法:动态规划【推荐这个方法】
//最长上升子序列
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#define min(a,b) a<b?a:b;
using namespace std;
int a[105],dp[105];
int main()
{
int n,i,j;
cin>>n;
//dp[i]:表示以第i个索引位置的数结束的最长序列长度
for(i=1;i<=n;i++)
cin>>a[i];
int ans=0;
for(i=1;i<=n;i++)
{
dp[i]=1;
for(j=1;j<i;j++)
{
if(a[i]>a[j])
dp[i]=max(dp[i],dp[j]+1);
}
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}