资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000
#include<iostream>
using namespace std;
const int N=10e3+10;
int dp[N][N];//dp[i][j]为在(i,j)上时的最大金币数量
int main(){
int n;
scanf("%d",&n);
int a[n+1][n+1];//a[i][j]为在(i,j)上的金币数量
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
//初始化第一行和第一列的dp
dp[1][1]=a[1][1];
for(int i=2;i<=n;i++){
dp[1][i]=dp[1][i-1]+a[1][i];//第一行
dp[i][1]=dp[i-1][1]+a[i][1];//第一列
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
dp[i][j]=max(dp[i-1][j]+a[i][j],dp[i][j-1]+a[i][j]);
}
}
printf("%d\n",dp[n][n]);
return 0;
}
注意:记得初始化dp的第一行和第一列。