动态规划--数字三角形

动规解题的一般思路

1、将原问题分解为子问题

  • 把原问题分解为若干个子问题,子问题和原问题形式相同或类似,只不过规模变小了。子问题都解决,原问题即解决(数字三角形例)
  • 子问题的解一旦求出就会被保存,所以每个子问题只需求解一次。

2、确定状态

在用动态规划解题时,我们往往将和子问题相关的各个变量的一组取值,称之为一个“状态”。一个“状态”对应于一个或多个子问题,所谓某个“状态”下的“值”,就是这个“状态”所对应的子问题的解。

3、确定一些初始状态(边界状态)的值

以“数字三角形”为例,初始状态就是底边数字,值就是底边数字值。

4、确定状态转移方程

定义出什么是“状态”,以及在该 “状态”下的“值”后,就要找出不同的状态之间如何迁移――即如何从一个或多个“值”已知的“状态”,求出另一个“状态”的“值” 。状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。

能用动规解决的问题的特点

  1. 问题具有最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质。
  2. 无后效性。当前的若干个状态值一旦确定,则此后过程的演变就只和这若干个状态的值有关,和之前是采取哪种手段或经过哪条路径演变到当前的这若干个状态,没有关系。

题目描述 Description

下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。 
(1)每一步可沿左斜线向下或右斜线向下 
(2)1 < 三角形行数 < 100 
(3)三角形数字为0,1,…99 
这里写图片描述

输入描述 Input Description

有很多个测试案例,对于每一个测试案例, 通过键盘逐行输入,第1行是输入整数(如果该整数是0,就表示结束,不需要再处理),表示三角形行数n,然后是n行数

输出描述 Output Description

输出最大值。

样例输入 Sample Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

样例输出 Sample Output

30单纯的递归调用会浪费大量的时间空间;递归不一样要用函数实现,用递推一样可以体现。
#include<stdio.h>
#define MAX_NUM 100
int D[MAX_NUM+10][MAX_NUM+10];
int MaxNum[MAX_NUM+10][MAX_NUM+10];
int main()
{
    int N,i,j;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
        for(j=1;j<=i;j++)
        scanf("%d",&D[i][j]);//构建数字三角形

    for(i=1;i<=N;i++)
        MaxNum[N][i]=D[N][i];//最底下的一行赋值为本身

    for(i=N;i>1;i--)
    for(j=1;j<i;j++){
        if(MaxNum[i][j]>MaxNum[i][j+1])
            MaxNum[i-1][j]=MaxNum[i][j]+D[i-1][j];
        else
            MaxNum[i-1][j]=MaxNum[i][j+1]+D[i-1][j];
    }
    printf("AND THIS LONGEST PATH IS  ");
    for(i=1,j=1;i<=N;i++)
    {
        printf("%d->",D[i][j]);
        if(MaxNum[i+1][j]>MaxNum[i+1][j+1]);
        else
            j++;
    }
    printf("END . SUM is%d\n",MaxNum[1][1]);
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值