問題描述
如果有人認為吃東西只需要嘴巴,那就錯了。
都知道舌頭有這麼乙個特性,「由簡入奢易,由奢如簡難」(據好事者考究,此規律也適合許多其他情況)。具體而言,如果是甜食,當你吃的食物不如前面剛吃過的東西甜,就很不爽了。
大寶是乙個聰明的美食家,當然深諳此道。一次他來到某小吃一條街,準備從街的一頭吃到另一頭。為了吃得爽,他大費周章,得到了各種食物的「美味度」。他拒絕不爽的經歷,不走回頭路而且還要爽歪歪(爽的次數盡量多)。
輸入格式
兩行資料。
第一行為乙個整數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 問題描述 如果有人認為吃東西只需要嘴巴,那就錯了。都知道舌頭有這麼乙個特性,由簡入奢易,由奢如簡難 據好事者考究,此規律也適合許多其他情況 具體而言,如果是甜食,當你吃的食物不如前面剛吃過的東西甜,就很不爽了。大寶是乙個聰明的...