从数塔的顶层出发,在每一个结点可以选择向左走或向右走,一直走到底层,要求找出一条路径,使得路径上的数值和最大
解决这个问题,可以将这个大问题分为若干个子问题求解,但是,子问题之间却往往不是独立的,是相互关联的,如果用分治法求解,这些子问题的重叠部分被重复计算多次,动态规划法将每个子问题求解一次并将其解保存在一个表格(通常采用数组)中,当需要再次解此子问题时,只是简单地通过查表获得该子问题的解,从而避免了大量重复计算。
对于这道题目,我们可以将从第二层开始,分为两个子树,然后,比较这两个子树从底层找一条路径相加得到的最大值,不就可以知道是走右边还是左边了?
举个例子:
在(a)中 16比4大,所以选择16,同理,18比4大,选18,然后 18比10大,选10,然后将他们和上一层那个数相加,即16+8=24 ; 18+10=28; 18+5=23;(比较出结果后,把列的下表记录在 path[][]中,然后,然后逐渐往上,记录下表,最终得出路径的表格)
然后,两两比较,显然,28是最大的,所以选择10这条路 ,以此类推,最终回到顶层。
#include<stdio.h> //使用库函数printf
const int n=5; //假设数塔是5层
int DataTorwer(int d[n][n]); //函数声明,求解n层数塔
//以下是主函数
int main()
{
int d[n][n]={
{
8},{
12,15},{
3,9,6},{
8,10,5,12},