动态规划——Minimum-sum descent(数塔问题)

来源:互联网 发布:C语言初始化什么意思 编辑:程序博客网 时间:2024/05/16 09:49

题意:

给出一个数塔,求出从顶层到底层所经过的数字的最小(或者最大)和。

示例:


解决方案:

采用自底向上的动态规划方法,从最底层向上重构出新数塔,以最后一层为基础,从倒数第二层开始向上重新构造出新数塔,至顶层后唯一的一个数字就是最小值。

在这个过程中,推出arr[i][j]=Min(arr[i][j]左孩子,arr[i][j]右孩子)+arr[i][j],即:arr[i][j]=Min( arr[i+1][j],arr[i+1][j+1] )+arr[i][j]


示例代码:

#include"stdio.h"#define N 100int Min(int a,int b){    return a<b?a:b;}int DP(int arr[N][N],int n){    int i,j;    for(i=n-2; i>=0; i--)        for(j=0; j<=i; j++)            arr[i][j]+=Min(arr[i+1][j],arr[i+1][j+1]);    return arr[0][0];}int main(){    int n,arr[N][N];    int i,j;    while(scanf("%d",&n)&&n)    {        for(i=0; i<n; ++i)            for(j=0; j<=i; ++j)                scanf("%d",&arr[i][j]);        printf("%d\n",DP(arr,n));    }}


0 0