題幹:
蒜頭君在玩一款逃生的遊戲。在乙個 n×m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。
蒜頭初始化有 v 點血量,他的血量上限是 c,任何時刻他的生命值都不能大於血量上限,如果血量為 0 則會死亡,不能繼續遊戲。
矩形地圖上的四個角(1, 1),(1,m),(n,1),(n,m)為遊戲的出口。遊戲中只要選定了乙個出口,就必須朝著這個方向走。例如,選擇了左下的出口,就只能往左和下兩個方向前進,選擇了右上的出口,就只能往右和上兩個方向前進,左上和右下方向的出口同理。
如果成功逃生,那麼剩餘生命值越高,則遊戲分數越高。為了能拿到最高分,請你幫忙計算如果成功逃生最多能剩餘多少血量,如果不能逃生輸出−1。
第一行依次輸入整數 n,m,x,y,v,c(1接下來 n 行,每行有 m 個數字,代表地圖資訊。(每個數字的絕對值不大於100,地圖中蒜頭君的初始位置的值一定為 0)
一行輸出乙個數字,代表成功逃生最多剩餘的血量,如果失敗輸出 −1。
樣例輸入
4 4 3 2 5 101 2 3 4
-1 -2 -3 -4
4 0 2 1
-4 -3 -2 -1
樣例輸出
10題目分析:
(1)應將地圖分為四個部分討論,即:右上、左上、左下、右下
(2)具體討論每個部分時,應該先將邊界初始化
(3)當討論到達某一點的體力值時,應先判斷該點前一時刻的兩個方向的體力值是否為正,如果都<=0,說明此人在前一時刻已經死亡,那麼在該點處也是死亡狀態,即體力值為0
(4)不能只考慮在終點時體力值是否大於體力上限,也應該考慮在移動過程中是否會出現當前體力值大於體力上限的情況。(我就卡在這了,前面5組樣例都過了,就第六組不過)
**如下:
#includeusingnamespace
std;
int a[1005][1005
];int dp[1005][1005
];int
main()
}dp[x][y]=v;
int max=0
;
///右上
for(int i=x;i>=1;i--)
else
if(i==x)
}else
}else
if(j==y)
} else
}else
}else}}
}///左上
for(int i=x;i>=1;i--)
else
if(i==x)
}else
}else
}else}}
}///左下
for(int i=x;i<=n;i++)
else
if(j==y)
}else
}else
}else}}
} ///右下
for(int i=x;i<=n;i++)
else
if(j==y)
}else
}else
}else}}
}int res=max(max(max(dp[1][1],dp[1][m]),dp[n][1
]),dp[n][m]);
if(res>c)
else
if(res<=0
)
else
}
總結:**看上去有點亂,寫完以後才發現,有許多重複的**。以後再遇到這種情況,應將重複的**寫在乙個函式內,直接呼叫函式。
藍橋杯 計蒜客之買書
必須寫乙個部落格來出出心中這口惡氣,因為每次遇到遞迴的問題都會卡很長時間,這次也不例外 生氣的表情 哼 題幹 蒜頭君去書店買書,他有 m元錢,書店裡面有 n本書,每本書的 為 pi元。蒜頭君很愛學習,想把身上錢都用來買書,並且剛好買 k本書。請幫蒜頭君計算他是否能剛好用 m元買 k本書。第一行輸入 ...
藍橋杯 計蒜客之踏青
題幹 蒜頭君和他的朋友週末相約去召喚師峽谷踏青。他們發現召喚師峽谷的地圖是由一塊一塊格仔組成的,有的格仔上是草叢,有的是空地。草叢通過上下左右 4個方向擴充套件其他草叢形成一片草地,任何一片草地中的格仔都是草叢,並且所有格仔之間都能通過上下左右連通。如果用 代表草叢,代表空地,下面的峽谷中有 2 片...
計蒜客 逃生dp
蒜頭君在玩一款逃生的遊戲。在乙個 n m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v 點血量,他的血量...