給定乙個由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...