小強開始了他的功夫特訓,特訓的時間為n秒,有m個木頭人,每個木頭人的血量為a。小強的攻擊範圍為b,小強每次攻擊能對最多b個存活的木頭人造成1點傷害,每次攻擊需要1秒,當經過一次攻擊後木頭人的血量為0,木頭人死亡。當特訓結束時,小強最多能消滅多少個木頭人。
輸入:t
n,m,a,b
例:input:
15 5 2 2
output:
5解釋:
第一次攻擊:1 1 2 2 2
第二次攻擊:1 0 1 2 2
第三次攻擊:0 0 0 2 2
第四次攻擊:0 0 0 1 1
第五次攻擊:0 0 0 0 0
if __name__ == "__main__":
# 讀取第一行的n
num = int(sys.stdin.readline().strip())
ans =
for i in range(num):
# 讀取每一行
line = sys.stdin.readline().strip()
# 把每一行的數字分隔後轉化成int列表
values = list(map(int, line.split()))
n, m, a, b = values
if n < a:
die = 0
else:
die = min(n*b // a, m)
print(die)
有乙個方格遊戲是這樣的:給乙個n*n的矩陣,矩陣每乙個位置都有乙個值,初始的時候在左上角出發,並獲得該位置的值作為初始能量,
每次可以選擇向上、向下、向左、向右四個方向中的乙個,並且可以移動距離不大於k,且要保證到達的格仔的值要比當前位置的格仔的值要大,
否則不能移動到這個格仔,當無法移動時,遊戲結束。
現在想知道在所有可能的走的方案中,到達的位置的格仔值相加總和最大為多少。
輸入第一行乙個整數t,代表有t組測試資料。
接下來先輸入兩個整數n和k,代表矩陣的大小以及每一步最多能走多少個格仔。
接下來n行,每行n個數,代表矩陣的a的元素。
例如:輸入:
13 1
0 5 37
55 10 19
12 9 18
輸出:71
解釋:最大路徑為:0——5——10——19——37。和為71。
1、走矩陣,這種問題顯然需要動態規劃打表解決,或者廣度優先遍歷也可以解決。這裡採用動態規劃方案。對於動態規劃問題,首先需要定義dp陣列和dp陣列元素對應的意義,這裡定義dp[n][n],dp[i][j]表示從左上角走到i,j位置的最優策略。
2、對於這道題,要求到達的格仔的值要比當前位置的格仔的值要大,這個條件保證了行走過程中不會走回頭路,即一直朝著最大的目標前進,且走過的格仔不會回頭再走。這是乙個很重要的條件,如果沒有這個條件限制,打表過程中還需要記錄走過的路徑,防止回頭,但變換後的問題仍然可以求解。
3、動態規劃問題,最重要的就是遞迴表示式:
當前位置(i,j),下一步位置(k,l),(k,l)在(i,j)所能走到的下一步範圍。
d p[
k][l
]=ma
x(dp
[k][
l],d
p[i]
[j]+
arr[
k][l
])
,dp[k][l] = max(dp[k][l], dp[i][j] + arr[k][l]),
dp[k][
l]=m
ax(d
p[k]
[l],
dp[i
][j]
+arr
[k][
l]),
cond. (i,j)位置可達,(i,j)可達(k,l)
為了標註不可抵達的格仔,我們將dp初始化為-1;dp[0][0]=arr[0][0]。
4、上面提到,需要確定攻擊範圍。「每次可以選擇向上、向下、向左、向右四個方向中的乙個,並且可以移動距離不大於k」,則對應當前位置(i,j)為中心的十字形區域。
# dp[i][j]表示走到i,j位置的最優策略
# dp[i][j]等於0表示絕路
# i,j走到k,l
def find_max_path_v1(arr, n, k_):
dp =
for i in range(n):
dp[0][0] = arr[0][0]
max_sum = -1
for i in range(0, n):
for j in range(0, n):
# 不能走斜線
for k in range(max(i-k_, 0), min(i+k_+1, n)):
l=jif arr[k][l] > arr[i][j] and dp[i][j] > -1:
dp[k][l] = max(dp[k][l], dp[i][j] + arr[k][l])
if dp[k][l] > max_sum:
max_sum = dp[k][l]
for l in range(max(j-k_, 0), min(j+k_+1, n)):
k=iif arr[k][l] > arr[i][j] and dp[i][j] > -1:
dp[k][l] = max(dp[k][l], dp[i][j] + arr[k][l])
if dp[k][l] > max_sum:
max_sum = dp[k][l]
print(dp)
return max_sum
if __name__ == "__main__":
# 讀取第一行的n
num = int(sys.stdin.readline().strip())
ans =
for i in range(num):
# 讀取每一行
line = sys.stdin.readline().strip()
# 把每一行的數字分隔後轉化成int列表
values = list(map(int, line.split()))
n, k = values
arr =
for j in range(n):
line = sys.stdin.readline().strip()
res = find_max_path_v1(arr, n, k)
print(res)
阿里巴巴筆試題
1 有乙個虛擬儲存系統,若程序在記憶體中佔3頁 開始時記憶體為空 若採用先進先出 fifo 頁面淘汰演算法,當執行如下訪問頁號序列後1,2,3,4,5,1,2,5,1,2,3,4,5,會發生多少缺頁?a 7 b 8 c 9d 10 2 設有乙個順序棧s,元素s1 s2 s3 s4 s5 s6依次進棧...
阿里巴巴筆試題
題意 給定一串數字 判斷是否存在這三個元素,它們將數字串分為四個子串,其中每個子串的數字之和均相同 該3個元素不納入計算 要求時間複雜度和空間複雜度均不能超過o n 思路 奇妙的利用了單調性,列舉第一段的和,第一段的和確定了,那麼接下來的2,3,4段的和就都確定了,什麼單調性呢?就是i右移,j,k都...
阿里巴巴筆試題
1 有乙個虛擬儲存系統,若程序在記憶體中佔3頁 開始時記憶體為空 若採用先進先出 fifo 頁面淘汰演算法,當執行如下訪問頁號序列後1,2,3,4,5,1,2,5,1,2,3,4,5,會發生多少缺頁?a 7 b 8 c 9d 10 2 設有乙個順序棧s,元素s1 s2 s3 s4 s5 s6依次進棧...