试题 算法提高 聪明的美食家

试题 算法提高 聪明的美食家


问题描述
  如果有人认为吃东西只需要嘴巴,那就错了。
  都知道舌头有这么一个特性,“由简入奢易,由奢如简难”(据好事者考究,此规律也适合许多其他情况)。具体而言,如果是甜食,当你吃的食物不如前面刚吃过的东西甜,就很不爽了。
  大宝是一个聪明的美食家,当然深谙此道。一次他来到某小吃一条街,准备从街的一头吃到另一头。为了吃得爽,他大费周章,得到了各种食物的“美味度”。他拒绝不爽的经历,不走回头路而且还要爽歪歪(爽的次数尽量多)。
输入格式
  两行数据。
  第一行为一个整数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))

禁止转载。仅用于自己学习。对程序错误不负责。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值