问题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1022
写了差不多3个多小时这道题,果断菜鸟一枚啊。
这道题网上已经有人贴出了代码,但这东西没注释的话,除了写代码的人外,其他人就要花大量的时间来看懂了。
这道题涉及到动态规划,所以又复习了一下动态规划方面的内容,看到一篇不错的介绍动态规划的博客,这里介绍给大
家。http://www.cnblogs.com/kkgreen/archive/2011/06/26/2090702.html
代码及注解如下:
# include <stdio.h>
# define MAXN 10005
int max(int a, int b, int c)
{
int t;
t = (a>b ? a:b);
if (t < c) t = c;
return t;
}
//*****************************************************
int main()
{
int a[MAXN], T, n; //各变量下面会解释
int i, j, tmp, end, up, low;。
int r, s, t, ans;
scanf("%d", &T);
while (T > 0)
{
scanf("%d", &n);
ans = 0;
tmp = n*n+1; //输入数据的总个数再加1 ,也可不加1,则下面的for循环中要改为 i<=tmp
for (i=1; i<tmp; ++i)
scanf("%d", &a[i]);
//*********************************************
for (i=2; i<=n; ++i) //从第二行开始分析 ,且按照从顶向下的顺序分析
{
end = i*i+1; //第i行的坐标在up与end之间,第i-1行坐标在low和up之间
up = (i-1)*(i-1)+1;
low = (i-2)*(i-2);
//***************************下面的for才是计算的核心
for(j = up; j < end; ++j) //表示第i行的数据在数组中的下标位置,如第二行数据的下标是从2到4
{
r = s = t = 0; //代表数j的左上,正上,右上的三个数
tmp = j-2*i+1; // j数的左上的数的下标
if(tmp<up && tmp>low)
r = a[tmp];
if(tmp+1<up && tmp+1>low)
s = a[tmp+1];
if(tmp+2<up && tmp+2>low)
t = a[tmp+2];
a[j] += max(r, s, t); //运算并更新数组中的值
}
}
for (i = (n-1)*(n-1)+1; i < n*n+1; ++i) //遍历第n行数据 找最大值
if(ans < a[i]) ans = a[i];
printf("%d\n", ans);
--T;
}
return 0;
}