数字三角问题

动态规划的三角问题


  • 问题描述:如下数字三角
                                 7
                              3   8
                           8   1   0
                        2   7   4   4
                     4   5   2   6   5
               计算出从三角形的顶到低的一条路径,使得路径经过的数字和最大。

  • 代码:
/*************************************************************************
    > File Name: numbre_triangle.c
    > Author: zhanglp
    > Mail: 820221185@qq.com
    > Created Time: 2013年10月31日 星期四 15时37分57秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int trangle_num (int *arr, int n, int i, int *temp)
{
    if (i < 0)
        return 0;

    int     k = 0;
    int     s1, s2;
    int     rs;
    int     flag[i+1];
    memset ((char *)flag, 0, sizeof (flag));

    for (k = 0; k <= i; k++) {
        s1 = arr[i*(i+1)/2+k]+temp[k+1];
        s2 = arr[i*(i+1)/2+k]+temp[k];

        temp[k] = s1 > s2 ? s1 : s2;
        if (s1 > s2) flag[k] = 1;
    }

    rs = trangle_num (arr, n, i-1, temp);
    rs = rs + flag[rs];
    temp[n-i] = rs;

    return rs;
}

int main (void)
{
    int     n, i, j;
    printf ("input row : ");
    scanf ("%d", &n);

    int     arr[n*(n+1)/2];
    int     temp[n+2];
    memset ((char *)temp, 0, sizeof (temp));

    srand ((int)time(NULL));
    for (i = 0; i < 15; i++)
        arr[i] = rand () % 10;
        
    trangle_num (arr, n, 4, temp);
    for (i = 0; i < n; i++) {
        printf ("%d : ", temp[n-i+1]+1);
        for (j = 0; j <= i; j++)
            printf ("%d, ", arr[i*(i+1)/2+j]);
        printf ("\n");
    }
    printf ("max : %d\n", temp[0]);

    return EXIT_SUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值