算法 -- 数字三角形之动态规划

原创 2015年11月20日 01:10:22

好久没有好好写算法啦,因此今天晚上就思考实现老师说的一道算法题目: 用动态规划求解数字三角形.

下面简单描述下题目含义:

数字三角形中的数字要求为不超过100的非负整数.题目规定从最顶层开始往下走,选择一条路径,这条路径要求每一步沿着左斜线或者右斜线走,并且路径上的数字之和为最大值.

例如下面这样一个三角形:
1. 7
2. 3 8
3. 8 1 0
4. 2 7 7 4
5. 5 5 2 6 5
它有5行数据,其路径数字和最大值为30.

注:原题目的三角形为等边三角形,我们在实际处理中,将其记录为直角三角形.这时候它的每一步就是沿下走或者沿右斜线走.

思考 : 如何解决这样一个问题?

既然要求最大路径和,那么我们计算每一行每一个元素到达起点的数字和,并将其存储下来.最后进行比较最后一行的路径和信息即可实现.

参考代码

/*************************************************************************
 **     >  Name : num_triangle.c
 **     > Author: LiYingXiao (Sweethreart502) 
 **     >  Mail : liyingxiao502@gmail.com
 **     >  Blog : http://blog.csdn.net/u013166575
 **     > Created Time: 2015年11月19日 星期四 23时32分00秒
 ************************************************************************/

#include <stdio.h>
#define N 5

// 处理函数
int Process ( int n ) ;

int main ( int argc , char * argv[] )
{
//    int n ;

    int max ;

//    printf ( "请输入数字三角形的行数:\n" ) ;
//    scanf ( "%d" , &n ) ;

    max = Process ( N ) ;

    printf ( "\n最大路径和为%d.\n" , max ) ;

    return 0 ;
}

// 核心处理函数
int Process ( int n ) 
{
    int a[6][6] = { { 0 } , { 0 } , { 0 } , { 0 } , { 0 } , { 0 } } ;

    int i , j ;

    int t1 , t2 ;

    int max = 0 ;

    // 初始化数字三角形
    printf ( "请输入数字三角形每一行数据信息:\n" ) ;
    for ( i = 1 ; i <= n ; i++ ) {
        printf ( "请输入第%d行数据信息:\n" , i ) ;
        for ( j = 1 ; j <= i ; j++ ) {
            scanf ( "%d" , &a[i][j] ) ;
        }
    }

    // 计算每一行的的每一个元素到起点的最大距离
    for ( i = 2 ; i <= n ; i++ ) {
        for ( j = 1 ; j <= i ; j++ ) {
            t1 = a[i][j] + a[i-1][j-1] ;
            t2 = a[i][j] + a[i-1][j] ;

            if ( t1 > t2 ) {
                a[i][j] = t1 ;
            } else {
                a[i][j] = t2 ;
            }
        }
    }

    // 比较最后一行数据信息,输出最大值即可
    for ( i = 1 ; i <= n ; i++ ) {
        if ( a[n][i] > max )   {
            max = a[n][i] ;
        }
    }

    return max ;
}

我的代码实现依赖于将数组存储为n+1行n+1列,下标含0的值都为0,这样做的原因是:
为了全局统一实现,我从三角形第二行开始计算它的每一个元素到达起点的最大数据和,采用计算方式是a[i][j] = max ( a[i-1][j-1] , a[i-1][j] ) + a[i][j] .
如果有不理解的可以尝试下在草稿纸上分析则很容易理解. -.-

0
0 7
0 3 8
0 8 1 0
0 2 7 7 4
0 5 5 2 6 5
上面的三角形即我的初始数组a.

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

动态规划(DP)之入门学习-数字三角形

数字三角形案例题目描述 Description下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。 (1)每一步可沿左斜线向下或右斜线向下 ...
  • zwhlxl
  • zwhlxl
  • 2015-05-29 10:11
  • 5216

10.1动态规划例题:数字三角形

10.1 什么是动态规划 前面学过了用递归的方法解决问题。但是,单纯的递归,在解决某些问题的时候,效率 会很低。例如下面这道题目: 例题:数字三角形  问题描述  7  ...
  • lalor
  • lalor
  • 2011-11-10 09:55
  • 16293

教你彻底学会动态规划——入门篇

动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙...

数字三角形问题 (动态规划初步)

问题描述: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数。    从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部...

蓝桥杯-动态规划-java算法训练 数字三角形

问题描述   (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路   径,使该路径所经过的数字的总和最大。   ●每一步可沿左斜线向下或右斜线向下走;   ●1<三角形行数...

动态规划算法:数字三角形问题

问题描述: 有一个有非负整数组成的三角形,第一行只有一个数,除了最下行之外的每个数的左下方和右下方各有一个数。如下图: 从第一行的数字开始每次可以向左走或者向右走,直到走到最下行,把沿...

动态规划 数字三角形

  • 2011-12-19 22:19
  • 576KB
  • 下载

hihoCoder - 1037 - 数字三角形 (动态规划)

#1037 : 数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后...

hiho#1037 : 数字三角形 (动态规划)

#1037 : 数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)