51Nod 1489 蜥蜴和地下室

2021-08-13 07:16:16 字數 1424 閱讀 3579

1489 蜥蜴和地下室

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 10 

難度:2級演算法題

哈利喜歡玩角色扮演的電腦遊戲《蜥蜴和地下室》。此時,他正在扮演乙個魔術師。在最後一關,他必須和一排的弓箭手戰鬥。他唯一能消滅他們的辦法是乙個火球咒語。如果哈利用他的火球咒語攻擊第i個弓箭手(他們從左到右標記),這個弓箭手會失去a點生命值。同時,這個咒語使與第i個弓箭手左右相鄰的弓箭手(如果存在)分別失去b(1 ≤ b < a ≤ 10)點生命值。

因為兩個端點的弓箭手(即標記為1和n的弓箭手)與你相隔較遠,所以火球不能直接攻擊他們。但是哈利能用他的火球攻擊其他任何弓箭手。

每個弓箭手的生命值都已知。當乙個弓箭手的生命值小於0時,這個弓箭手會死亡。請求出哈利殺死所有的敵人所需使用的最少的火球數。

如果弓箭手已經死亡,哈利仍舊可以將他的火球扔向這個弓箭手。

input

第一行包含3個整數 n, a, b (3 ≤ n ≤ 10; 1 ≤ b output

以一行輸出t——所需要的最少的火球數。

input示例

3 2 1

2 2 2

output示例

3
51nod-1489-蜥蜴和地下室

思路:dfs || dp

dfs:

先把陣列兩端打爆,

最開始思考dfs時,

以每一次可以攻擊除兩端的任意元素來dfs,結果時間超限,然後不死心,開始剪枝,結果還有兩組資料就是過不了。。然後又用bfs來寫,結果爆空間。。。 

然後看了這篇部落格才搞定

51nod 1489 蜥蜴和地下室(dfs or dp)

,原來是我dfs的思路錯了

首先把陣列兩端打爆,然後從左向右搜尋,每次從當前元素到下一元素時,必須保證當前元素的前一元素以被打爆。

#includeusing namespace std;

int n,a,b,ss=1e9;

int d[15];

void dfs(int t,int s);

int main()

dfs(1,0);

if(ss!=1e9) ans+=ss;

cout<=ss) return;

if(t==n)

if(d[t-1]>=0) t1=d[t-1]/b+1;

if(d[t]>=0) t2=d[t]/a+1;

if(t1>t2)

dp[2][d[1]][d[2]][d[3]]=0;//滿血狀態的攻擊次數為0 

for(int t=2;t=0;--i)

for(int j=d[t];j>=0;--j)

for(int k=d[t+1];k>=0;--k)

cout<

51Nod 1489 蜥蜴和地下室

這道題 一開始想的是貪心 但是想歪了 每次打對傷害總體貢獻最大的乙個 因為小資料 所以隨便怎麼搞 然後 wa了幾發 又想到小資料列舉還能有什麼 於是dfs搜尋 這道我想的是列舉搜尋路徑 因為能對當前loc位置產生傷害只能有三個位置loc 1,loc,loc 1 所以在打後面的敵人之前 可以把他前面的...

51nod 1489蜥蜴和地下室

1489 蜥蜴和地下室 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 哈利喜歡玩角色扮演的電腦遊戲 蜥蜴和地下室 此時,他正在扮演乙個魔術師。在最後一關,他必須和一排的弓箭手戰鬥。他唯一能消滅他們的辦法是乙個火球咒語。如果哈利用他的火球咒語...

51nod 1489 蜥蜴和地下室

1489 蜥蜴和地下室 因為兩個端點的弓箭手 即標記為1和n的弓箭手 與你相隔較遠,所以火球不能直接攻擊他們。但是哈利能用他的火球攻擊其他任何弓箭手。每個弓箭手的生命值都已知。當乙個弓箭手的生命值小於0時,這個弓箭手會死亡。請求出哈利殺死所有的敵人所需使用的最少的火球數。如果弓箭手已經死亡,哈利仍舊...