求最长上升子序列的长度---dp

求最长上升子序列的长度—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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章