资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000
一开始很蠢,就是只比较当前格子的右边和下面的金币大小,这样就忽视了其它的格子。
然后这是后来修正的代码:
#include<stdio.h>
int a[1001][1001];
int main(void)
{
int b;
int i,j;
scanf("%d",&b);
for(i=0;i<b;i++)
{
for(j=0;j<b;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0,j=1;j<b;j++)
{
a[i][j]+=a[i][j-1];
a[j][i]+=a[j-1][i];
}
for(i=1;i<b;i++)
{
for(j=1;j<b;j++)
{
if(a[i-1][j]>a[i][j-1])
a[i][j]+=a[i-1][j];
else
a[i][j]+=a[i][j-1];
}
}
printf("%d",a[i-1][j-1]);
return 0;
}
根本思路就是构建一个动态的二维数组,把到每一过程的金币变化全都表示出来,思路上和前面那道抽签题差不大多。
对于刚接触算法的人来说可能比较难(比如我!!!),但其实你把这道题看作一道数学题,大概就是教一个不会这道题的人怎么做这道题的这种感觉,只是那个人现在是电脑,而你用的语言必须让电脑能听懂,仅此而已。