数塔问题属于最经典最简单的动态规划问题了,这到题目要求是找到一条路径,使得从最顶层走到最下面,所经过的节点的加和最大。
分析也是从上向下分析然后从下向上计算。
如下图所示
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;
}