求最長上升子序列的長度—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;
}