#include<bits/stdc++.h>
using namespace std;
//走格子问题
//0 3 4
//6 2 5
//5 4 3
//从左上角走到右下角,每次只能向右或向下走
//1.状态dp[i][j] 从左上角走到i,j花费的最小体力
//2.状态转移方程:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j]
int a[101][101];
int dp[101][101];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
//3.边界
for (int i = 2; i <= n; i++)
dp[i][1] = dp[i - 1][1] + a[i][1];
for (int j = 2; j <= n; j++)
dp[1][j] = dp[1][j - 1] + a[1][j];
for (int i = 2; i <= n; i++)
for (int j = 2; j <= n; j++)
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
cout << dp[n][n];
cout << endl<<"------------dp表-------------" << endl;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
printf("%2d ", dp[i][j]);
cout << endl;
}
return 0;
}
动态规划-走格子问题
于 2023-02-20 21:08:02 首次发布