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

2021-10-18 19:08:58 字數 1459 閱讀 3875

問題描述

如果有人認為吃東西只需要嘴巴,那就錯了。

都知道舌頭有這麼乙個特性,「由簡入奢易,由奢如簡難」(據好事者考究,此規律也適合許多其他情況)。具體而言,如果是甜食,當你吃的食物不如前面剛吃過的東西甜,就很不爽了。

大寶是乙個聰明的美食家,當然深諳此道。一次他來到某小吃一條街,準備從街的一頭吃到另一頭。為了吃得爽,他大費周章,得到了各種食物的「美味度」。他拒絕不爽的經歷,不走回頭路而且還要爽歪歪(爽的次數盡量多)。

輸入格式

兩行資料。

第一行為乙個整數n,表示小吃街上小吃的數量

第二行為n個整數,分別表示n種食物的「美味度」

輸出格式

乙個整數,表示吃得爽的次數

樣例輸入

103 18 7 14 10 12 23 41 16 24

樣例輸出

6資料規模和約定

美味度為0到100的整數

n<1000

思路:

題意說的是大寶每次吃美味度都要大於或者等於上次的美味度,問這條街按順序吃的話如何讓爽的次數盡量多,就是大於或者等於上次的美味度的最多次數。

從題意我們最多這個選擇吃的數是按順序吃但可以跳著吃,所以我們只需要求當時在這個位置的最大次數就可以了, 比如 3 18 7 14 我在7這個位置時前面我應該選比現在小的美味度那就是3如果這樣選擇那爽的次數就是2, 如果選擇18因為 18>7 那當時就只有7這個美味度。

所以我們可以選建立應該dp[i] 表示當前位置的最多次數。那麼我們知道只選擇自己的話美味次數就是1。那麼dp的初始值就是1.

我們按剛剛上面的邏輯的話就可以建立2個for 第一層表示當前的位置, 第二層表示取前面最多的次數並且要小於當前為i。

那我們只考慮當s[i]>=s[j]時的情況:因為dp[j]是之前的最多次數我們需要加當前的美味次數那就是1.

所以我們轉移就是: dp[i]=max(dp[i],dp[j]+1)

程式:

n=

int(

input()

)s=list

(map

(int

,input()

.split())

) dp=[1

for i in

range

(n+5)]

#初始化1

for i in

range

(n):

#當前位置i

for j in

range

(i):

#前面位置的遍歷

if s[i]

>=s[j]

:#當滿足當前美味值大於等於前面美味值

dp[i]

=max

(dp[i]

,dp[j]+1

)print

(max

(dp)

)

演算法提高 聰明的美食家

演算法提高 聰明的美食家 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如果有人認為吃東西只需要嘴巴,那就錯了。都知道舌頭有這麼乙個特性,由簡入奢易,由奢如簡難 據好事者考究,此規律也適合許多其他情況 具體而言,如果是甜食,當你吃的食物不如前面剛吃過的東西甜,就很不爽了。大寶是乙個聰明的...

演算法提高 聰明的美食家

問題描述 如果有人認為吃東西只需要嘴巴,那就錯了。都知道舌頭有這麼乙個特性,由簡入奢易,由奢如簡難 據好事者考究,此規律也適合許多其他情況 具體而言,如果是甜食,當你吃的食物不如前面剛吃過的東西甜,就很不爽了。大寶是乙個聰明的美食家,當然深諳此道。一次他來到某小吃一條街,準備從街的一頭吃到另一頭。為...

藍橋杯 ADV 166 演算法提高 聰明的美食家

演算法提高 聰明的美食家 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如果有人認為吃東西只需要嘴巴,那就錯了。都知道舌頭有這麼乙個特性,由簡入奢易,由奢如簡難 據好事者考究,此規律也適合許多其他情況 具體而言,如果是甜食,當你吃的食物不如前面剛吃過的東西甜,就很不爽了。大寶是乙個聰明的...