動態規劃 《走金子塔》 python實現

2021-08-23 12:30:21 字數 1568 閱讀 4631

給定乙個由n行數字組成的數字三角型,如圖所示。設計乙個演算法,計算從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。路徑上的每一步都只能往左下或右下走,給出這個最大和。

7 3  8 

8  1  0 

2  7  4  4 

4  5  2  6  5

這個問題**於poj1163。對於這種問題,我們可以有正向和反向兩種思考方式。正向思考這個問題,dp[i][j]表示從第一行第一列到第i行第j列最大的數字總和;反向思考這個問題,dp[i][j]表示從第i行第j列到最後一行最大的數字總和。反向思考的**要簡潔一些,在poj上這兩份**所用時間都是32ms。當然我們還可以對空間再進行優化,這裡就不再細說了。

#coding:utf-8

import sys

if __name__ == '__main__':

n = input()

a =

for i in range(n):

b = sys.stdin.readline().strip().split(' ')

b = map(int, b)

dp = [[0] * n for i in range(n)]

dp[0][0] = a[0][0] #初始化狀態

for i in range(1, n):

for j in range(0, i + 1):

if j != 0:

dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + a[i][j]) #更新狀態

if j != i:

dp[i][j] = max(dp[i][j], dp[i - 1][j] + a[i][j]) #更新狀態

c = 0

for i in range(0, n):

if c < dp[n - 1][i]:

c = dp[n - 1][i]

print c

從最底層開始往上走:

#coding:utf-8

import sys

if __name__ == '__main__':

n = input()

a =

for i in range(n):

b = sys.stdin.readline().strip().split(' ')

b = map(int, b)

dp = [[0] * n for i in range(n)]

for i in range(0, n):

dp[n - 1][i] = a[n - 1][i]

for i in range(1, n):

for j in range(0, n - i):

dp[n - 1 - i][j] = max(dp[n - i][j] + a[n - 1 - i][j], dp[n - i][j + 1] + a[n - 1 - i][j])

print dp[0][0]

動態規劃走樓梯

main.cpp 動態規劃走樓梯 created by liujan on 11 18 14.問題描述 乙個樓梯有20級,每次走1級或2級,從底走到 頂一共有多少種走法?分析 假設從底走到第n級的走法有f n 種,走到第n級 有兩個方法,乙個是從第 n 1 級走1步,另乙個是從第 n 2 級走2步,...

SDUT 動態規劃 走迷宮 1269

走迷宮 pblem description 有乙個mn格的迷宮 表示有m行 n列 其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,輸入這mn個資料和起始點 結束點 起始點和結束點都是用兩個資料來描述的,分別表示這個點的行號和列號 現在要你程式設計找出所有可行的道路,要求所走的路中沒有重...

動態規劃 走台階(入門1)

題目 有n級台階,乙個人每次上一級或者兩級,問有多少種走完n級台階的方法?分析 由分析可知 n階台階,只可能是從n 1或是n 2的台階上走上來的,台階n的階段依賴的是n 1和n 2的子階段,所以狀態轉移方程為dp n dp n 1 dp n 2 屬於最簡單的動態規劃問題 include define...