1、拿金币
题目: 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
分析
- 该题目考察动态规划,我们可以就利用题中的二维数组。(i,j)代表坐标,x[i][j]代表到达坐标(i,j)时的最优解,即拿到最多的金币。
- .找到数组元素之间的关系。上个数字与本次数字的关系
- 意思就是在n*n的位置中,每个位置为累加最大值的和
- 在下面的循环中,if条件语句是来判断第一层和第一列,而其他就是根据b[i][j]+=max(b[i-1][j],b[i][j-1])这个规则
#include<stdio.h>
#define N 1001
int a[N][N];
int main()
{
int n,i,j,sum,k;
scanf("%d",&n);
for(i=1;i<=n;i++)//行
{
for(j=1;j<=n;j++)//列
{
scanf("%d",&a[i][j]);
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==1)//判断第一层
{
a[i][j] += a[i][j-1];//横着加
}else if(j==1){
a[i][j] += a[i-1][j];//横着加
}else{
if(a[i][j-1]>a[i-1][j])
{
a[i][j] += a[i][j-1];
}else{
a[i][j] += a[i-1][j];
}
}
}
}
printf("%d",a[n][n]);
return 0;
}