CSU1022菜鸟与大牛

问题链接  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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值