算法提高 聰明的美食家(動態規劃 LIS)

試題 算法提高 聰明的美食家

資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
  如果有人認爲喫東西只需要嘴巴,那就錯了。
  都知道舌頭有這麼一個特性,“由簡入奢易,由奢如簡難”(據好事者考究,此規律也適合許多其他情況)。具體而言,如果是甜食,當你喫的食物不如前面剛喫過的東西甜,就很不爽了。
  大寶是一個聰明的美食家,當然深諳此道。一次他來到某小喫一條街,準備從街的一頭喫到另一頭。爲了喫得爽,他大費周章,得到了各種食物的“美味度”。他拒絕不爽的經歷,不走回頭路而且還要爽歪歪(爽的次數儘量多)。
輸入格式
  兩行數據。
  第一行爲一個整數n,表示小喫街上小喫的數量
  第二行爲n個整數,分別表示n種食物的“美味度”
輸出格式
  一個整數,表示喫得爽的次數
樣例輸入
10
3 18 7 14 10 12 23 41 16 24
樣例輸出
6
數據規模和約定
  美味度爲0到100的整數
  n<1000


  LIS裸題,採用動態規劃思想。

狀態  	dp[i] 代表喫第i個食物得到的最大滿足度
狀態的轉移  for(int j=0;j<i;j++)		//可以挑它前面的任意一個美食喫
			if(i的美味度大於或者等於j) dp[i]=max(dp[i],dp[j]+1);
#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
	int n,ans=0;
	int dp[1000];
	int data[1000];
	
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&data[i]);
	}
	
	dp[0]=1;
	for(int i=1;i<n;i++){	//遍歷每一個食物
		dp[i]=1;	
		for(int j=0;j<i;j++)	//遍歷這個食物之前的每一個食物
			if(data[i]>=data[j])
				dp[i]=max(dp[i],dp[j]+1);
	}
		
	for(int i=0;i<n;i++)
		ans=max(ans,dp[i]);
	printf("%d",ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章