资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000
思路:
二维数组存储金币数据。
将每个格子所能得到的最多金币存入一个新的二维数组。(只能从一个格子走到它右边或下边的格子里)所以,所在格子最大金币数量只能是上面格子的最大数量或者左边格子的最大数量加上所在格子
- 源代码:
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
int b[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==0&&j==0){
b[i][j]=a[i][j];
}
else{
if(i==0){
b[i][j] =a[i][j]+b[i][j-1];
}
if(j==0){
b[i][j] =a[i][j]+b[i-1][j];
}
if(i!=0&&j!=0){
if(b[i-1][j]>b[i][j-1]){
b[i][j] =a[i][j]+b[i-1][j];
}
else{
b[i][j] =a[i][j]+b[i][j-1];
}
}
}
}
}
cout<<b[n-1][n-1]<<endl;
return 0;
}