动态规划之打怪兽:一维DP

小美打怪

题目链接https://ac.nowcoder.com/acm/problem/261577

问题分析

问题描述

在这个游戏中,小美面临 n 个怪物,每个怪物具有血量 h[i] 和攻击力 a[i],而小美的初始血量和攻击力分别为 HA。小美能够击败那些血量和攻击力都小于自己的怪物,并且在击败怪物后,她的血量和攻击力将会变成该怪物的血量和攻击力。

问题要求我们计算出小美最多能够击败多少个怪物。

输入格式

  • 第一行三个整数 nHA,分别表示怪物的数量,小美的血量,小美的攻击力。
  • 第二行 n 个整数 h[i],表示每个怪物的血量。
  • 第三行 n 个整数 a[i],表示每个怪物的攻击力。

输出格式

输出小美最多能够击败的怪物数量。

思路分析

1. 基本思路

要解这个问题,首先要考虑的点是:

  • 小美可以击败那些血量和攻击力都小于自己的怪物。
  • 每当小美击败一个怪物后,她的血量和攻击力就会变为该怪物的血量和攻击力。
  • 小美可以击败的怪物数量是一个递增的过程,且小美必须从最容易击败的怪物开始逐步击败,最大化她能够击败的怪物数量。

2. 动态规划(DP)思想

我们可以使用 动态规划 来解决这个问题。动态规划的核心是:

  • 状态定义dp[i] 表示以第 i 个怪物为结尾,小美最多可以击败的怪物数量。
  • 状态转移:如果当前怪物 i 能够击败前面的某个怪物 j(即 h[i] > h[j]a[i] > a[j]),那么我们就更新 dp[i] = max(dp[i], dp[j] + 1)

3. 排序

为了简化问题,我们可以先对怪物进行排序:

  • 按照血量升序排序,确保小美可以优先击败血量较小的怪物。
  • 在血量相同的情况下,我们按攻击力升序排序,这样可以确保小美尽可能从攻击力较小的怪物开始。

4. 最终计算

最后,我们需要遍历 dp 数组,找出满足条件(小美的血量和攻击力都大于怪物)的最大值,这就是小美能够击败的最多怪物数量。

解决方案

代码实现

# 输入数据
n = input()
G_num, M_blood, M_attack = map(int, n.split())
G_blood = list(map(int, input().split()))
G_attack = list(map(int, input().split()))

maxs = 0
dp = [1] * G_num
s = [{'a': G_attack[i], 'b': G_blood[i]} for i in range(G_num)]

# 按照怪物血量升序,攻击力升序排序
s.sort(key=lambda x: (x['b'], x['a']))

# 动态规划,计算每个怪物能击败的最多怪物数量
for i in range(G_num):
    for j in range(i):
        if s[i]['a'] > s[j]['a'] and s[i]['b'] > s[j]['b']:
            dp[i] = max(dp[i], dp[j] + 1)

# 找到可以击败的最多怪物
for i in range(G_num):
    if s[i]['a'] < M_attack and s[i]['b'] < M_blood:
        maxs = max(maxs, dp[i])

print(maxs)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值