srm 181 div1 1000(状压dp)

本文介绍了一种使用最多15个bit表示武器的策略,通过记忆化搜索算法解决克洛人通关最少攻击次数的问题。具体步骤包括枚举被打败的boss和费用选择最优武器,实现高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
克洛人。。打败n个Boss通关。每个Boss掉一把装备,每把装备对n个Boss有不同伤害值。初始有一把对所有Boss伤害值都为1的枪。
n no more than 15,求最少攻击次数
思路:
用最多15个bit来表示现在拥有的武器。然后可以用记忆化搜索解决。
转移的时候,先枚举被打败的boss,再枚举费用,即使用哪把武器攻击次数最少。

int dp[32768], shots[16][16], n;

class KiloManX
{
        public:
    int go(int x) {
        if (dp[x] != -1) return dp[x];
        int &ret = dp[x];
        ret = inf;
        rep(i, 0, n-1) if (1<<i & x) {
            int cost = shots[n][i]; // default weapon
            rep(j, 0, n-1) if (i != j && (1<<j & x)) // choose minimum cost
                cost = min(cost, shots[j][i]);
            ret = min (ret, cost + go (x ^ (1<<i)));
        }
        return ret;
    }

        int leastShots(vector <string> damageChart, vector <int> bossHealth)
        {
        n = damageChart.size();
        rep(i, 0, n-1) shots[n][i] = bossHealth[i];
        rep(i, 0, n-1) rep(j, 0, n-1) {
            if (i == j || damageChart[i][j] == '0') shots[i][j] = inf;
            else shots[i][j] = (bossHealth[j] + damageChart[i][j] - '1') / (damageChart[i][j] - '0');
        }
        memset(dp, -1, sizeof(dp));
        dp[0] = 0;
        return go( (1<<n) - 1 );
        }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值