試題 算法提高 聰明的美食家
資源限制
時間限制: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;
}