动态规划 数塔问题

Posted 亮星的信息学小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划 数塔问题相关的知识,希望对你有一定的参考价值。

今天开始进入到动态规划了!


题    目

 设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,请找出一条路径,使路径之和最大,只要输出路径的和。


动态规划 数塔问题



解    析



动态规划 数塔问题
     

这道题


是很经典的动态规划


有的同志可能会问


用别的方法不好吗


下面我给大家来看看


别的方法的


以下是大型翻车现场!!!


**(翻车现场1)深度优先搜索(穷举)**:


从根结点开始,将所有可能的路径求和,找出最大值。


N=1,P=1


N=2,P=2


N=3,P=4

……

N=K,P=2^(K-1)


例如:N=50,P=2^49=500万亿条路径!!!


算法复杂度:O(2^(N-1))


**(翻车现场2)深度优先搜索(递归)**:


动态规划 数塔问题

**存在的问题**:出现重复子问题,需要解决重复计算问题。


**(翻车现场3)贪心算法**:


动态规划 数塔问题



根据贪心算法


得出的解为:13-11-21


而实际上最优解应为:13-8-40。


贪心算法往往得不到最优解。


**不忍直视!!!


动态规划的题目


一般有两点


1、重复子问题


2、最优子结构


这道题完全符合以上两点


在输入的时候


是这样输入的:


13

11 8

12 7 26

6 14 15 8

12 7 13 24 11


从倒数第二行


往第一行推


每一行


从左到右推


每一个


都加等于这个数下面的值或右下角的值中大的那一个


算到最后


最上面的值就是最大的


最重要的动规方程:


b[n][i]=a[n][i],(i=1..n)  //初始状态


b[i][j]=max{b[i+1][j],b[i+1][j+1]}+a[i][j]


下面附上代码




加油!

动态规划 数塔问题


经典动态规划—数塔问题的代码



动态规划 数塔问题

       

#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n,a[1000][1000],b[1000][1000];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
cin>>a[i][j];
b[i][j]=a[i][j];
}
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++)
{
b[i][j]=max(b[i+1][j],b[i+1][j+1])+a[i][j];
}
cout<<b[1][1];
return 0;
}



加油!


动态规划 数塔问题




动态规划 数塔问题

我的萌萌哒老妹!



加油




往期精彩推荐




某些图片来自互联网,如有侵权,请联系删除


欢迎关注

亮星的信息学小屋

亮星的信息学小屋

动态规划 数塔问题


觉得有用,请点右下方“在看”,谢谢鼓励


以上是关于动态规划 数塔问题的主要内容,如果未能解决你的问题,请参考以下文章

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

动态规划1入门问题 数塔

数塔 简单的 动态规划

动态规划——数塔问题

数塔-动态规划

hdu-2084 数塔(动态规划)