蜥蜴和地下室(深搜)
个人心得:心态炸了,玩了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 }