题目大意
用2N - 1的步数出去 => 只有向下走或者向右走(因为只有向下走和向右走会离终点更近,只有全部向下走和向右走才能刚好达到2N - 1到达终点,如果走别的路一定会大于这个值)。
然后原问题转化为:摘花生
算法:线性DP$O(n ^ 2)$
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int g[N][N];
int f[N][N];
int n;
int main(){
ios :: sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin >> g[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i == 0 && j == 0) f[i][j] = g[i][j];
else
{
int t = INT_MAX;
if(i) t = min(t,f[i - 1][j]);
if(j) t = min(t,f[i][j - 1]);
f[i][j] = t + g[i][j];
}
}
cout << f[n - 1][n - 1] << endl;
return 0;
}