问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000
分析:这题是对dp的简单运用,我作为初学者在看了一篇文章之后都会做了,下面附上代码
#include <bits/stdc++.h>
using namespace std;
#define debug(a) cout<<#a<<"="<<a<<endl;
#define lyh(i,a,b) for(int i=a;i<b;i++)
#define hyl(i,a,b) for(int i=a;i>b;i--)
#define LL long long
int a[1005][1005];
int dp[1005][1005];
int main() {
int n;
cin >> n;
lyh(i, 0, n)
lyh(j, 0, n)
cin >> a[i][j];
lyh(i, 0, n)
lyh(j, 0, n)
dp[i][j] = 0;
/*
有两种走的方式:第一种走下面,第二种走右边
要到达i,j 要不然就是从(i-1,j)然后走下面
要不然就是从(i,j-1)走右边
所以dp[i][j] = dp[i-1][j]+dp[i][j-1]
涉及到一个初始状态
*/
lyh(i, 0, n) {
lyh(j, 0, n) {
//在左上角的角落
if (i == 0 && j == 0) {
dp[i][j] = a[i][j];
}
//在最上面,只能往下走
if (i == 0 && j != 0) {
dp[i][j] = dp[i][j - 1] + a[i][j];
}
//在最左边,只能往右边走
if (i != 0 && j == 0) {
dp[i][j] = dp[i - 1][j] + a[i][j];
}
//随便走
if (i != 0 && j != 0) {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
}
}
}
cout << dp[n - 1][n - 1] << endl;
return 0;
}
代码的大部分地方都写了比较详细的注解,相信大家都能看懂