1. 程式人生 > 其它 >AcWing 1018. 最低通行費

AcWing 1018. 最低通行費

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;
}