数塔问题----动态规划

来源:互联网 发布:mac无法更新软件 编辑:程序博客网 时间:2024/06/07 13:35


数塔问题属于最经典最简单的动态规划问题了,这到题目要求是找到一条路径,使得从最顶层走到最下面,所经过的节点的加和最大。

分析也是从上向下分析然后从下向上计算。

如下图所示

                    9

               12    15

          10      6     8

      2     18       9    5

19      7       10    4    16




下面给出代码

#include <iostream>#include <stdio.h>using namespace std;int num[5][5]={{19,7,10,4,16},{2,18,9,5},{10,6,8},{12,15},{9}};int dp[5][5]={{0},{0},{0},{0},{0}};int max(int x,int y){    return x>y?x:y;}void printWay(int i,int j){    if(i==0)        return;    else if(dp[i-1][j]>dp[i-1][j+1])    {        printf("-->%d",num[i-1][j]);        printWay(i-1,j);    }    else    {        printf("-->%d",num[i-1][j+1]);        printWay(i-1,j+1);    }}int main(){    for(int i=0;i<5;i++)    {        for(int j=0;j<5-i;j++)        {            if(i==0)                dp[i][j]=num[i][j];            else                dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+num[i][j];            printf("%d  ",dp[i][j]);        }        printf("\n");    }    printf("最大%d  ",dp[4][0]);    printf("%d",num[4][0]);    printWay(4,0);    return 0;}


原创粉丝点击