c++——动态规划_数塔问题

复习一哈

【北大公开课】 算法设计与分析 屈婉玲教授https://www.bilibili.com/video/BV1Ls411W7PB?p=35      p35~p42

补充

源码用到了 容器 与 迭代器

c++——标准库类型vector(容器)_阿根不会弹Wings的博客-CSDN博客https://blog.csdn.net/qq_22046265/article/details/123877704?spm=1001.2014.3001.5502c++——迭代器_初识(iterator)_阿根不会弹Wings的博客-CSDN博客https://blog.csdn.net/qq_22046265/article/details/124106687?spm=1001.2014.3001.5502

1.问题

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

示例:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5qC55LiN5Lya5by5V2luZ3M=,size_14,color_FFFFFF,t_70,g_se,x_16

 

 2.源码

#include<iostream>
#include<vector>
using namespace std;

typedef struct elem
{
	int data;
	int val;
	elem* next;
	elem* lFather;
	elem* rFather;
	elem* lChild;
	elem* rChild;

}Node,*pNdoe;

constexpr int Tree_arr[] = { 9,12,15,10,6,8,2,18,9,5,19,7,10,4,16 };
constexpr int Tree_depth = 5;
vector<pNdoe> v;//储存指针

void CreatTree()
{
	pNdoe p = new Node;
	int index = 0;
	p->data = p->val = Tree_arr[index++];//第0层 手动添加
	p->lChild = p->lFather = p->rChild = p->rFather = p->next = nullptr;
	v.push_back(p);
	pNdoe temp = nullptr;
	for (int i = 1; i < Tree_depth; i++)//赋值
	{
		for (int j = 0; j <= i; j++)
		{
			temp = new Node;
			temp->data = temp->val = Tree_arr[index++];
			temp->lChild = temp->rChild = temp->lFather = temp->rFather = temp->next = nullptr;
			if (j == 0)
			{
				temp->rFather = *(v.end() - i);
				temp->rFather->lChild = temp;
			}
			if (j == i)
			{
				temp->lFather = *(v.end() - j - 1);
				temp->lFather->rChild = temp;
			}
			if (j != 0 && j != i)
			{
				temp->lFather = *(v.end() - i - 1);
				temp->rFather = *(v.end() - i);
				temp->lFather->rChild = temp;
				temp->rFather->lChild = temp;
			}
			v.push_back(temp);
		}
	}
	return ;
}

pNdoe Dynamic()//动态规划
{
	for (int i=v.size()-1;i>=0;i--)
	{
		if (v[i] != nullptr)//判断是否遍历完成
		{
			if (v[i]->rChild != nullptr && v[i]->rChild != nullptr)
			{
				if (v[i]->lChild->val >= v[i]->rChild->val)
				{
					v[i]->val += v[i]->lChild->val;
					v[i]->next = v[i]->lChild;
				}
				else
				{
					v[i]->val += v[i]->rChild->val;
					v[i]->next = v[i]->rChild;
				}
			}
		}
		else
		{
			cout << "容器所指为空" << endl;
		}
	}
	return v[0];//返回首指针
}

void Print(pNdoe p)
{
	cout <<endl<< "the max is :" << p->val << endl;
	cout << "最大路径是:";
	while (p!=nullptr)
	{
		cout << p->data << "->";
		p = p->next;
	}
	cout << "aGen" << endl << "aGen 是世界的镜头 0.0" << endl;
}

void main()
{
	CreatTree();
	Print(Dynamic());
	return;
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5qC55LiN5Lya5by5V2luZ3M=,size_9,color_FFFFFF,t_70,g_se,x_16

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值