在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:

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

已经告诉你了,这是个DP的题目,你能AC吗?
Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
一开始学长讲这个题的时候就听懵逼的,回来自己研究了一下,发现还可以。主要是要有从下往上的意识,可以用两种方法,记忆化搜索和dp,先说记忆话搜索
代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mp[101][101];
int mk[101][101];
int dp[101][101];
int d[][2]={{1,0},{1,1}};//根据题意写方向。
int n;
int dfs(int x,int y)
{if(dp[x][y]!=-1) return dp[x][y];if(x==n) dp[x][y]=mp[x][y];//当到达最底层的时候,就要将dp[x][y]更新为mp[x][y].int max_=0;for(int i=0;i<2;i++){int tx=x+d[i][0];int ty=y+d[i][1];//if(tx>n||ty>tx) continue;if(mk[tx][ty]) continue;mk[tx][ty]=1;max_=max(max_,dfs(tx,ty)+mp[x][y]);mk[tx][ty]=0;}return dp[x][y]=max_;/*else{int tx=dfs(x+1,y);int ty=dfs(x+1,y+1);dp[x][y]=max(tx,ty)+mp[x][y];}return dp[x][y];*/
}
int main()
{int m;cin>>m;while(m--){cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)cin>>mp[i][j];memset(dp,-1,sizeof(dp));//因为有可能是0,所以一开始全为-1。cout<<dfs(1,1)<<endl;}return 0;
}

接下来就是dp思想了。。其实比记忆化搜索简单,就是个动态规划。
代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[1010][1010];
int dp[1010][1010];
int n;
int main()
{cin>>n;for(int i=0;i<n;i++){for(int j=0;j<=i;j++)cin>>a[i][j];}for(int i=0;i<n;i++)dp[n-1][i]=a[n-1][i];for(int i=n-2;i>=0;i--){for(int j=0;j<=i;j++){dp[i][j]=max(dp[i][j],dp[i+1][j]+a[i][j]);dp[i][j]=max(dp[i][j],dp[i+1][j+1]+a[i][j]);}}cout<<dp[0][0]<<endl;return 0;
}

思路跟记忆化搜索大同小异。个人推荐第二种,比记忆化搜索简单且好想。嘿嘿
努力加油a啊,(o)/~

J - 数塔 HDU - 2084(深搜,记忆化搜索+)相关推荐

  1. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  2. hdu 4597 Play Game(记忆化搜索)

    题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp ...

  3. Palindrome subsequence HDU - 4632 区间dp|记忆化搜索

    // 区间dp import java.util.Scanner;/**** @author CN*/ public class main {static int mod = 10007;static ...

  4. 数塔 HDU - 2084

    题目 给定一个具有 N 层的数字三角形,从顶至底有多条路径,每一步可沿左斜线向下或沿右斜线向下,路径所经过的数字之和为路径得分,请求出最大路径得分. 输入 1 5 7 3 8 8 1 0 2 7 4 ...

  5. hdu 5535 Cake 构造+记忆化搜索

    闯橙睦涛帕赂币昭操涎椅势崩昭酉饲环苛刑饶几涛每皇忠伤谥倘两够昭当膳唤帕菲淹负恫皇兰僬卣搪仗跃甲磕允康倘饶好睦考戮巳环几吓戮两几负必侵忠缆倘纠饶贪膳淹兰由沟几复倘饲拖昭刑焦僬把踪萍负蜕必梢陡合弛坡淹两操 ...

  6. 01迷宫(深搜寻找+记忆化搜索)

    01迷宫(深搜+记忆化搜索) 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. ...

  7. 动态规划入门——记忆化搜索

    文章目录 记忆化搜索 1.数塔问题 2.滑雪 总结 记忆化搜索 1.数塔问题 [动规:递归求解] 递推方程: 不难发现,最后一层的点到最后一层的最大距离即为自己对应的值a[n - 1][y],这个就是 ...

  8. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  9. hdu 1142 记忆化搜索

    题目是这样的,貌似一开始我这个英语搓的人还理解错了...orz http://acm.hdu.edu.cn/showproblem.php?pid=1142 就是最短路,只不过用dijkstra是从终 ...

最新文章

  1. 2018年最后几天学什么?给你关注度最高的10篇文章
  2. [导入]ubuntu全面介绍 与 ubuntu截图
  3. centos7标准版命令界面和图形界面相互切换
  4. 【数据库系统概论】考研第二部分重点分析【2.2】
  5. vs2019功能介绍_MFC界面库BCGControlBar v30.0新功能详解:支持VS 2019
  6. 前端学习(2226):react之状态
  7. 【Linux】设置vim格式
  8. 圣杯布局——针对前端小白篇
  9. ES6 iterator 迭代器
  10. HTML的标签元素分类的区别
  11. mysql 查询优化 ~ 分区表查询的探索
  12. Talib技术因子详解(七)
  13. 推荐一款好用的加密软件 filepackage 文件加密 U盘加密 移动硬盘加密
  14. hackerrank Java Data Structures
  15. css携程讲解,【译】CSS的布局数学:读懂calc – 携程设计委员会
  16. excel 与mysql交互_excel和数据库交互
  17. spark原理及其优化
  18. 第一章 JSON语法用法
  19. h5打开麦克风权限录音_微信H5录音实现
  20. React Native 连接夜神模拟器

热门文章

  1. c语言必背数据结构_数据结构(C语言)考试重点必背
  2. python做数据分类_二分类怎么做数据分析python
  3. java开发环境jdk1.8_linux 搭建 jdk1.8 java开发环境
  4. GHUnit for iOS测试指南
  5. anaconda如何更改环境配置_Anaconda环境配置2020-08-27
  6. 聊聊Elasticsearch的TimedRunnable
  7. RabbitMQ系列(一)RabbitMQ在Ubuntu上的环境搭建
  8. Vue.js入门教程-组件注册
  9. Nginx实现404页面的几种方法
  10. mysql 在windows中安装问题