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