问题描述:
思路分析:
python代码求解:
import numpy as np import pandas as pd # l为单个礼物矩阵 l = np.array([[5, 3, 5, 1], [1, 5, 3, 5], [4, 2, 1, 1], [1, 5, 1, 3], [1, 5, 3, 4]]) def f(M): ## 计算礼物最大累加值 FF = np.copy(M) # 获取行数和列数 row = len(l) col = len(l[0]) # 计算出M中第一行和第一列礼物的累加和(即确定边界条件) FF[:, 0] = np.cumsum(M[:, 0]) FF[0, :] = np.cumsum(M[0, :]) # 每一个礼物的近邻路境要么为上面下来的,要么为左边过来的(依次遍历,解决动态规划子问题) for i in range(1, row): for j in range(1, col): tem1 = FF[i, j-1] + M[i, j] tem2 = FF[i-1, j] + M[i, j] FF[i, j] = max(tem1, tem2) # 选择上面和左面最大的礼物作为路径来源 # 输出最大礼物累加和 f = FF[row-1, col-1] ## 获取最大礼物累加和的路径 IND = [[0 for _ in range(col)] for _ in range(row)] IND[-1][-1] = 1 # 先用FF-M对应位置处的值(FF为礼物累加和矩阵,M为单个礼物矩阵)记为cha, # 寻找FF上面或下面为cha的位置,使IND对应的位置为1并使行或列减1,循环此过程直到行和列都为初始位置 while row != 0 and col != 0: temp1 = M[row-1][col-1] temp2 = FF[row-1][col-1] cha = temp2 - temp1 if FF[row-2][col-1] == cha: IND[row-2][col-1] = 1 row -= 1 elif FF[row - 1][col - 2] == cha: IND[row-1][col-2] = 1 col -= 1 else: break df = pd.DataFrame(IND) # 转为dataframe型数据 return f, IND, df f, IND, df = f(l) print(f) print(IND) print(df) #注:此题图片及思路来源于数学建模清风,如有侵权请告知