51NOD--1489 蜥蜴和地下室--dfs

哈利喜欢玩角色扮演的电脑游戏《蜥蜴和地下室》。此时,他正在扮演一个魔术师。在最后一关,他必须和一排的弓箭手战斗。他唯一能消灭他们的办法是一个火球咒语。如果哈利用他的火球咒语攻击第i个弓箭手(他们从左到右标记),这个弓箭手会失去a点生命值。同时,这个咒语使与第i个弓箭手左右相邻的弓箭手(如果存在)分别失去b(1 ≤ b < a ≤ 10)点生命值。

因为两个端点的弓箭手(即标记为1和n的弓箭手)与你相隔较远,所以火球不能直接攻击他们。但是哈利能用他的火球攻击其他任何弓箭手。

每个弓箭手的生命值都已知。当一个弓箭手的生命值小于0时,这个弓箭手会死亡。请求出哈利杀死所有的敌人所需使用的最少的火球数。

如果弓箭手已经死亡,哈利仍旧可以将他的火球扔向这个弓箭手。


 收起

输入

第一行包含3个整数 n, a, b (3 ≤ n ≤ 10; 1 ≤ b < a ≤ 10),第二行包含n个整数——h1,h2,...,hn (1 ≤ hi ≤ 15), hi 是第i个弓箭手所拥有的生命力。

输出

以一行输出t——所需要的最少的火球数。

输入样例

3 2 1
2 2 2

输出样例

3

dfs,先把头尾打一下,再dfs。

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int ans1=inf;
int ans=0;
int n,a,b;
int h[100];
void dfs(int x,int num)
{
    //处理当前第x位置上的
    if(x==n-1)//走到最后一步
    {
        ans1=min(ans1,num);
        return ;
    }
    if(h[x-1]<0)
        dfs(x+1,num);
    int t=0;
    if(h[x-1]>=0)
    {
        t=h[x-1]/b+1;
        h[x-1]-=t*b;
        h[x]-=t*a;
        h[x+1]-=t*b;

        dfs(x+1,num+t);

        h[x-1]+=t*b;
        h[x]+=t*a;
        h[x+1]+=t*b;
    }
    int t1=h[x]/a+1;
    if(h[x]>=0&&t1>t)
    {
        for(int i=t+1; i<=t1; i++)
        {
            h[x-1]-=i*b;
            h[x]-=i*a;
            h[x+1]-=i*b;

            dfs(x+1,num+i);

            h[x-1]+=i*b;//
            h[x]+=i*a;//
            h[x+1]+=i*b;
        }
    }
    return;

}
int main()
{
    ans1=inf;
    cin>>n>>a>>b;
    for(int i=0; i<n; i++)
    {
        cin>>h[i];
    }
    int x=0;
    //打头
    x=h[0]/b+1;
    ans=x;
    h[0]-=b*x;
    h[1]-=a*x;
    h[2]-=b*x;
    if(h[n-1]>=0)
    {
        x=h[n-1]/b+1;
        h[n-1]-=x*b;
        h[n-2]-=x*a;
        h[n-3]-=x*b;
        ans+=x;
    }
    //cout<<ans<<"  ddddd "<<endl;
    dfs(1,0);
    if(ans1==inf)
        ans1=0;
        cout<<ans+ans1<<endl;
        //10 4 3
//2 1 2 4 2 4 3 2 2 4    --6
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值