蒜頭君在玩一款逃生的遊戲。在乙個 n×m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。
蒜頭初始化有 v 點血量,他的血量上限是 c,任何時刻他的生命值都不能大於血量上限,如果血量為 0 則會死亡,不能繼續遊戲。
矩形地圖上的四個角(1,1),(1,m),(n,1),(n,m)為遊戲的出口。遊戲中只要選定了乙個出口,就必須朝著這個方向走。例如,選擇了左下的出口,就只能往左和下兩個方向前進,選擇了右上的出口,就只能往右和上兩個方向前進,左上和右下方向的出口同理。
如果成功逃生,那麼剩餘生命值越高,則遊戲分數越高。為了能拿到最高分,請你幫忙計算如果成功逃生最多能剩餘多少血量,如果不能逃生輸出 −1-1−1。
第一行依次輸入整數 n,m,x,y,v,c(1接下來 nnn 行,每行有 m 個數字,代表地圖資訊。(每個數字的絕對值不大於100,地圖中蒜頭君的初始位置的值一定為 0)
一行輸出乙個數字,代表成功逃生最多剩餘的血量,如果失敗輸出 −1。
樣例輸入
4 4 3 2 5 10
1 2 3 4
-1 -2 -3 -4
4 0 2 1
-4 -3 -2 -1
樣例輸出
#includeusing namespace std;
int n,m,x,y,v,c;
int val[1010][1010]=};
int dp[1010][1010]=};
int mixx=-0x3f3f3f3f;
void solve()
else if(i==x)
if(dp[i][j]>c)
}else if(j==y)
if(dp[i][j]>c)
}else if(jc)}}}
//右上
for(int i=x;i>=1;i--)
if(dp[i][j]>c)
}else if(j>y)
if(dp[i][j]>c)}}
} //左下
for(int i=x+1;i<=n;i++)
if(dp[i][j]>c)
}else if(jc)}}
}//右下
for(int i=x+1;i<=n;i++)
if(dp[i][j]>c)}}
} int t=max(dp[1][1],dp[1][m]);
t=max(t,dp[n][1]);
t=max(t,dp[n][m]);
if(t>0)
else
}int main()
} solve();
return 0;
}
計蒜客 逃生(基礎動態規劃)
蒜頭君在玩一款逃生的遊戲。在乙個 n times mn m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v...
藍橋杯 計蒜客之逃生
題幹 蒜頭君在玩一款逃生的遊戲。在乙個 n m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v 點血量,他...
計蒜客 劃分整數(dp)
劃分整數 蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 nn n 分解成不多於 kk k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 n 300 n 1 leq n leq 300 n 1 n ...