hdoj 4310 Hero (状态压缩DP)

该博客介绍了如何利用状态压缩动态规划(DP)解决一个竞技游戏策略问题,即在一定条件下如何以最小的血量损失击败n个具有不同攻击力和血量的英雄。博主分享了两种方法,一种是贪心策略,按DPS/HP比例排序消灭英雄;另一种是官方的状态压缩DP解法,通过遍历所有可能的英雄状态并更新最小HP消耗。
摘要由CSDN通过智能技术生成
题意:需要杀死n个英雄,怎么使自己的受到伤害最小。对面每个英雄有攻击力(DPS)和血量(HP),回合制,你每次可以打一个英雄,打掉一滴血。对方每回合所以存活的英雄都会攻击你,你掉的血量等于攻击你的英雄攻击力之和。

思路:比赛时没做出来,因为没学状态压缩 但发现大家都用贪心给过了 。。。以dps/hp 排序,先干掉hp小的,dps大的
另一种就是官方的状态压缩DP :用dp[mask]表示杀死mask集合的敌人时,这些敌人造成的最小hp消耗。有转移方程dp[mask] = min{dp[mask - {i}] + hp_sum[mask] * dps[i], for all i in mask}

方法1:
#include <stdio.h>
#include <string.h>

int dp[1<<20],hp[25],dps[25],hp_sum;

int min (int a,int b)
{
      return a > b ? b : a;
}
int count_sum (int x)    //计算出每个x状态的hp的和
{
      int t = 1,i = 1,ans = 0;
      while (t <= x)
      {
              if (x&t)
                      ans += hp[i];
              t = t<<1;
              i ++;
      }
      return ans;
}
int main ()
{
      int n,i;
      while (~scanf ("%d",&n))
      {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值