AcWing 1018. 最低通行費
阿新 • • 發佈:2021-07-02
AcWing 1018
Descripition
給定一個 \(N * N\) 的矩陣,每個格子都有價值\(M[i][j]\),最多隻能走\(2N-1\)
步,問從\((1, 1)\) 走到\((N, N)\) 可獲得的最小價值。
Solution
因為最多隻能走\(2 * N - 1\)步,不難想到這就限定了只能向右或向下走。
所以與摘花生類似。
轉移方程:\(f[i][j] = min(f[i - 1][j], f[i][j - 1])\)
初始值:\(f[1][1] = a[1][1];\)
注意這裡因為求最小值,\(f\) 一開始要賦最大值,且在轉移時也要特判。
Code
#include <bits/stdc++.h> using namespace std; const int N = 105; int n, a[N][N], f[N][N]; int main() { cin >> n; for(int i = 1; i <= n ; i++) { for(int j = 1; j <= n; j++) { cin >> a[i][j]; } } memset(f, 0x3f, sizeof f);//開始時f為最大值 f[1][1] = a[1][1]; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i != 1 || j != 1)//特判 f[i][j] = min(f[i - 1][j], f[i][j - 1]) + a[i][j]; } } cout << f[n][n]; return 0; }