1018.最低通行料
ビジネスマンは、非常に重要なビジネスイベントに参加するために、N×Nの正方形のグリッドを通過します。
彼はグリッドの左上隅から入り、右下隅から出る必要があります。
真ん中の小さな四角を横切るのに1単位の時間がかかります。
マーチャントは(2N-1)単位時間で取り消し線を引く必要があります。
そして、真ん中の小さな四角を通り抜けるときは、一定の料金を払う必要があります。
マーチャントは、指定された時間内に最小のコストで取り消し線を引くことを期待しています。
少なくともいくらかかりますか?
注:各小さな正方形を斜めに横切ることはできません(つまり、上下左右にしか移動できず、グリッドを離れることはできません)。
入力形式
最初の行は整数で、正方形の幅Nを表します。次のN行では、各行に100以下のN個の整数が含まれています。これは、グリッド上の各小さな正方形のコストです。
出力フォーマット
最小必要コストを示す整数を出力します。データ範囲1≤N≤100
入力サンプル:5 1 4 6 8 10 2 5 7 15 17 6 8 9 18 20
10 11 12 19 21 20 23 25 29 33
出力サンプル:109サンプル説明
サンプル、最小値109 = 1 + 2 + 5 + 7 + 9 + 12 + 19 + 21 +33です。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int M = 0x3f3f3f3f;
int a[110][110];
int dp[110][110];
int main() {
int n;
cin >> n;
memset(dp, M, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == 1 && j == 1)
{
dp[i][j] = a[i][j];
continue;//注意
}
if (i > 1)
dp[i][j] = min(dp[i - 1][j], dp[i][j]);
if (j > 1)
dp[i][j] = min(dp[i][j], dp[i][j - 1]);
dp[i][j] += a[i][j];
}
}
cout << dp[n][n];
return 0;
}