[AcWing 1018] 最低通行费

image
image


点击查看代码
#include<iostream>

using namespace std;

const int N = 110;
const int INF = 1e9;

int n;
int s[N][N], f[N][N];

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= n; j ++)
			cin >> s[i][j];
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= n; j ++) {
			if (i == 1 && j == 1)	f[i][j] = s[i][j];
			else if (i == 1)	f[i][j] = f[i][j - 1] + s[i][j];
			else if (j == 1)	f[i][j] = f[i - 1][j] + s[i][j];
			else f[i][j] = min(f[i - 1][j], f[i][j - 1]) + s[i][j];
		}
	cout << f[n][n] << endl;
	return 0;
}

  1. 状态表示
    \(f[i][j]\) 表示从 \((1,1)\)\((i,j)\) 的所有路线的最小值
  2. 状态计算
    \(f[1][1] = s[1][1]\)
    ② 第一行,\(i = 1\)\(f[i][j] = f[i][j - 1] + s[i][j]\)
    ③ 第一列,\(j = 1\)\(f[i][j] = f[i - 1][j] + s[i][j]\)
    ④ 其他情况,$f[i][j] = min(f[i - 1][j], f[i][j - 1]) + s[i][j] $
posted @ 2022-06-15 22:55  wKingYu  阅读(48)  评论(0)    收藏  举报