动态规划法———数塔问题

#include<stdio.h>
#include<stdlib.h>
int DataTower(int d[][5],int n);

int main(void)
{
    int s;    
    int n=5;
    int a[5][5];
	a[0][0]=8; 
	a[1][0]=12; a[1][1]=15;
	a[2][0]=3; a[2][1]=9; a[2][2]=6;
	a[3][0]=8; a[3][1]=10; a[3][2]=5; a[3][3]=12;
	a[4][0]=16; a[4][1]=4; a[4][2]=18; a[4][3]=10; a[4][4]=9;
    s=DataTower(a,5);
    return 0;
}

int DataTower(int d[][5],int n)   //求解树塔问题,数塔存储在数组d[n][n]中
{
    int maxAdd[n][n];
    int path[n][n];
    int i,j;
    for(int i=0; i<5; i++)
    {
        for(int j=0; j<=i; j++)
        {
            maxAdd[i][j]=0;;
            path[i][i]=0;
        }
    }
    for(j=0; j<n; j++)   //初始化底层决策结果
        maxAdd[n-1][j]=d[n-1][j];
    for(i=n-2; i>=0; i--)   //进行i层决策
    {
        for(j=0; j<=i; j++)   //填写addMax[i][j],只填写下三角
        {
            if( maxAdd[i+1][j] > maxAdd[i+1][j+1] )
            {
                maxAdd[i][j]=d[i][j]+maxAdd[i+1][j];
                path[i][j]=j;   //本次抉择选取下标j的元素
            }
            else
            {
                maxAdd[i][j]=d[i][j]+maxAdd[i+1][j+1];
                path[i][j]=j+1;   //本次抉择选取下标j+1的元素
            }
        }
    }
    printf("路径最大和是:%d\n",maxAdd[0][0]); 
    printf("路径为:%d",d[0][0]);   //输出顶层数字
    j=path[0][0];   //顶层决策选择下标为path[0][0]的元素
    for(i=1; i<5; i++)
    {
        printf("-->%d",d[i][j]);
        j=path[i][j];   //本层决策是选择下一层下标为path[i][j]的元素
    }
    return maxAdd[0][0];   //返回最大数值和,即最终结果
 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值