#动态规划5部曲—确定dp含义、写出递推公式、初始化、遍历、打印dp(debug) #确定dp[i][j]含义 #dp[i][j]表示第i行第j列的格子的最小路径和 #写出递推公式 #i行j列只能从i-1行j列或者i行j-1列来 #故:dp[i][j]=min(dp[i-1][j]+cast[i][j],dp[i][j-1]+cast[i][j]) #初始化 #要对所有边界都初始化,对于只能往右和往下,最左边和最上边就是边界,也就是第一行和第一列 n,m=map(int,input().split()) cast=[[int(i) for i in input().split()] for j in range(n)] # print(cast) dp=[[0 for i in range(m)] for j in range(n)] #初始化第一行 for i in range(m): for j in range(i+1): dp[0][i]+=cast[0][j] #初始化第一列 for i in range(1,n): for j in range(i+1): dp[i][0]+=cast[j][0] # print(dp) #遍历 for i in range(1,n): for j in range(1,m): dp[i][j]=min(dp[i-1][j]+cast[i][j],dp[i][j-1]+cast[i][j]) print(dp[n-1][m-1])