问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2样例输出
11
数据规模和约定
n<=1000
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
do{
cin>>n;
}while(n>1000);
int a[n][n];
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
int f[2][n];
int old=1,now=0;
for(i=0;i<n;i++){
old=now;
now=1-now;
for(j=0;j<n;j++){
if(i==0&&j==0){
f[now][j]=a[i][j];
continue;
}
f[now][j]=0;
if(i==0){
f[now][j]=f[now][j-1]+a[i][j];
}
else if(j==0){
f[now][j]=f[old][j]+a[i][j];
}
else{
f[now][j]=max(f[old][j]+a[i][j],f[now][j-1]+a[i][j]);
}
}
}
cout<<f[now][n-1];
return 0;
}