试题 算法提高 聪明的美食家
作者:互联网
试题 算法提高 聪明的美食家
问题描述
如果有人认为吃东西只需要嘴巴,那就错了。
都知道舌头有这么一个特性,“由简入奢易,由奢如简难”(据好事者考究,此规律也适合许多其他情况)。具体而言,如果是甜食,当你吃的食物不如前面刚吃过的东西甜,就很不爽了。
大宝是一个聪明的美食家,当然深谙此道。一次他来到某小吃一条街,准备从街的一头吃到另一头。为了吃得爽,他大费周章,得到了各种食物的“美味度”。他拒绝不爽的经历,不走回头路而且还要爽歪歪(爽的次数尽量多)。
输入格式
两行数据。
第一行为一个整数n,表示小吃街上小吃的数量
第二行为n个整数,分别表示n种食物的“美味度”
输出格式
一个整数,表示吃得爽的次数
样例输入
10
3 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))
禁止转载。仅用于自己学习。对程序错误不负责。
标签:试题,18,美食家,range,次数,算法,美味,dp 来源: https://blog.csdn.net/weixin_46640345/article/details/113568522