蜥蜴和地下室(深搜)

个人心得:心态炸了,玩了10天的国庆来,感觉脑子太短路了,好不容易理清思路,就是先将俩边的打死,然后中间的就只能将左边的杀死才能继续深搜,

但此时如果还大于0,就有俩种选择就是直接打死或者借助右边的打死,不过我当时用if判断,然后思维一直卡,而且数据也难以回复,后面看了

题解发现思路是一样的不过他实现的比较好,就是将左边没死的单独拿出来,然后再将和打自己一起结合,即times是打死左边还活着的需要的次数,

time就是打死自己需要的次数,所以只要从times+1到time枚举就能够得出。

题目:

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

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

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

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

Input
第一行包含3个整数 n, a, b (3 ≤ n ≤ 10; 1 ≤ b < a ≤ 10),第二行包含n个整数——h1,h2,...,hn (1 ≤ hi ≤ 15), hi 是第i个弓箭手所拥有的生命力。
Output
以一行输出t——所需要的最少的火球数。
Input示例
3 2 1
2 2 2
Output示例
3
 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<cmath>
 7 #include<stack>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 using namespace std;
12 #define in 1000000007
13 int xue[15];
14 int n,a,b;
15 int sum=0;
16 int su=999999999;
17 void dfs(int i,int sm)
18 {
19     if(i==n)
20     {
21         if(su>sm) su=sm;
22         return ;
23     }
24     if(xue[i-1]<0)
25         dfs(i+1,sm);
26         int times=0;
27     if(xue[i-1]>=0)
28     {
29         times=xue[i-1]/b+1;
30         xue[i-1]-=times*b;
31         xue[i]-=times*a;
32         xue[i+1]-=times*b;
33         dfs(i+1,sm+times);
34         xue[i-1]+=times*b;
35         xue[i]+=times*a;
36         xue[i+1]+=times*b;
37     }
38     int time=xue[i]/a+1;
39     if(xue[i]>=0&&time>times)
40     {
41         for(int j=times+1;j<=time;j++)
42         {
43             xue[i-1]-=j*b;
44         xue[i]-=j*a;
45         xue[i+1]-=j*b;
46         dfs(i+1,sm+j);
47         xue[i-1]+=j*b;
48         xue[i]+=j*a;
49         xue[i+1]+=j*b;
50         }
51 
52     }
53     return ;
54 }
55 int main()
56 {
57     cin>>n>>a>>b;
58     for(int i=1;i<=n;i++)
59          cin>>xue[i];
60      int t=xue[1]/b+1;
61      sum+=t;
62      xue[1]-=t*b;
63      xue[2]-=t*a;
64      xue[3]-=t*b;
65      if(xue[n]>=0){
66     t=xue[n]/b+1;
67      sum+=t;
68      xue[n]-=t*b;
69      xue[n-1]-=t*a;
70      xue[n-2]-=t*b;
71      }
72      dfs(2,0);
73      if(su==999999999)
74          su=0;
75       cout<<sum+su<<endl;
76     return 0;
77 }
View Code


原文地址:https://www.cnblogs.com/blvt/p/7657751.html