名词解释:

DFS(Dynamic Plan):动态规划

DFS(Depth First Search):深度优先搜索

DFS与DP的关系

很多情况下,dfs和dp两种解题方法的思路都是很相似的,这两种算法在一定程度上是可以互相转化的。

想到dfs也就常常会想到dp,当然在一些特定的适用场合下除外。

dp主要运用了预处理的思想,而dfs则是类似于白手起家,一步步探索。一般来讲,能够预处理要好些,好比战争前做好准备。

dfs和dp都是十分重要的基础算法,在各个竞赛中都有涉及,务必精通。


题目:

The Triangle

描述:

编写一个程序,计算从顶部开始到底部某处的路径上传递的最大数字总和。 每个步骤可以向左下或右下滑动。

输入:

程序是从标准输入读取。 第一行包含一个整数N:三角形中的行数。 以下N行描述了三角形的数据。 三角形中的行数1<N<=100.三角形中的数字全部为整数,介于0到99之间。

输出:

程序是标准输出。输出最大的整数和。

 样例:

输入:

输出:


DFS思路:

自顶向下,将每种路径都走一遍。

通过迭代计算到最后一层,记录最后一层的所有值。最后一层中的最大值即为所求。

具体代码:

 #include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std; // the maximum of the triangle ordinal
const int max_ordinal = ;
// the depth
int num_of_rows;
// save data
int data[max_ordinal][max_ordinal];
// save the data of the final level
vector<int> ans; void dfs(int level, int sum, int column)
{
// avoid multi calculate
int current_sum = sum+data[level][column];
// save data which was in final level
if(level+ == num_of_rows)
{
ans.push_back(current_sum);
return;
}
// binary tree
dfs(level+, current_sum, column);
dfs(level+, current_sum, column+);
} int main()
{
cin >> num_of_rows;
for(int i = ; i < num_of_rows; i++)
for(int j = ; j <= i; j++)
scanf("%d", &data[i][j]); dfs(, , );
cout << "output data:" << endl; sort(ans.begin(), ans.end(), greater<int>());
for(int i = ; i < ans.size(); i++)
{
cout << ans[i] << "\t";
if(!((i+) % )) cout << endl;
}
cout << endl; return ;
}

DP思路:

dfs的思路是从上到下,而dp的思路是:从第二层开始,每下去一次往回看一下并取上一层相邻两个大的那个。

具体代码:

 #include <iostream>
#include <algorithm>
#include <functional>
using namespace std; // same as DFS
const int max_ordinal = ;
int num_of_rows;
int data[max_ordinal][max_ordinal];
// the array of the dp method
int dp[max_ordinal][max_ordinal]; int main()
{
cin >> num_of_rows;
for(int i = ; i < num_of_rows; i++)
for(int j = ; j<= i; j++)
scanf("%d", &data[i][j]); // dp now
dp[][] = data[][];
for(int i = ; i < num_of_rows; i++)
{
for(int j = ; j <= i; j++)
{
if(j- >= )
{
dp[i][j] = data[i][j] + max(dp[i-][j], dp[i-][j-]);
} else {
dp[i][j] = data[i][j] + dp[i-][j];
}
}
} // calling 'sort' method
sort(dp[num_of_rows-], &dp[num_of_rows-][num_of_rows], greater<int>());
for(int i = ; i < num_of_rows; i++)
cout << dp[num_of_rows-][i] << " ";
cout << endl;
cout << "answer is: ";
cout << dp[num_of_rows-][] << endl; return ;
}

DFS与DP算法的更多相关文章

  1. dfs与dp算法之关系与经典入门例题

    目录 声明 dfs与dp的关系 经典例题-数字三角形 - POJ 1163 题目 dfs思路 解题思路 具体代码 dp思路 解题思路 具体代码 声明 本文不介绍dfs.dp算法的基础思路,有想了解的可 ...

  2. POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)

    1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...

  3. UvaLive6661 Equal Sum Sets dfs或dp

    UvaLive6661 PDF题目 题意:让你用1~n中k个不同的数组成s,求有多少种组法. 题解: DFS或者DP或打表. 1.DFS 由于数据范围很小,直接dfs每种组法统计个数即可. //#pr ...

  4. 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

    一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...

  5. 最大子段和的DP算法设计及其效率测试

    表情包形象取自番剧<猫咪日常> 那我也整一个 曾几何时,笔者是个对算法这个概念漠不关心的人,由衷地感觉它就是一种和奥数一样华而不实的存在,即便不使用任何算法的思想我一样能写出能跑的程序 直 ...

  6. 华为笔试——C++平安果dp算法

    题目:平安果 题目介绍:给出一个m*n的格子,每个格子里有一定数量的平安果,现在要求从左上角顶点(1,1)出发,每次走一格并拿走那一格的所有平安果,且只能向下或向右前进,最终到达右下角顶点(m,n), ...

  7. dp算法之硬币找零问题

    题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...

  8. C++数字三角形问题与dp算法

    题目:数字三角形 题目介绍:如图所示的数字三角形,要求从最上方顶点开始一步一步下到最底层,每一步必须下一层,求出所经过的数字的最大和. 输入:第一行值n,代表n行数值:后面的n行数据代表每一行的数字. ...

  9. P1021 邮票面值设计(dfs+背包dp)

    P1021 邮票面值设计 题目传送门 题意: 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15N+K≤15)种邮票的情况下 (假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大 ...

随机推荐

  1. db2 锁表

    2019独角兽企业重金招聘Python工程师标准>>> 查询锁表情况 db2 => get snapshot for locks on databasename 可以看到什么表 ...

  2. 熟透vue手机购物商城开发的重要性

    带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址:   https://www.dua ...

  3. C++编程入门题目--No.3

    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 的结 ...

  4. Win10美吱er吱er,Win10修改默认字体的方法

    请参考以下步骤(需要修改注册表,修改前请先备份,以便在出现问题时能够及时恢复): 例:将系统字体改为宋体 1.Windows+r,输入:regedit 2.定位以下路径:HKEY_LOCAL_MACH ...

  5. 图论--2-SAT--暴力染色法模板(字典序最小解) RQ的板子

    //暴力DFS,求字典序最小的解,也是求字典序唯一的方法 #include<cstdio> #include<cstring> #include<vector> u ...

  6. predixy源码学习--开篇

    最近开始研究predixy.predixy是一款高性能全功能redis代理 ,网上有的文章大部分都是功能上的介绍,很少有源码相关的分享. predixy的相关介绍在github: https://gi ...

  7. pytest文档38-allure.setp添加测试用例步骤

    前言 一般流程性的测试用例,写成自动化用例时,步骤较多写起来会比较长.在测试用例里面添加详细的步骤有助于更好的阅读,也方便报错后快速的定位到问题. 举个常见的测试场景用例:从登陆开始,到浏览商品添加购 ...

  8. 补 第三场多校杭电 费用流 K Subsequence

    K Subsequence 这个题目是这个人想吃东西,但是他每次吃的都是他的美味值都必须不递减,可以吃k次,问这个最大的美味值是多少. 这个是一个比较明显的费用流,建图也很好建,但是呢,这个题目卡sp ...

  9. ssm(spring,spring mvc,mybatis)框架

    ssm框架各个技术的职责 spring :spring是一个IOC DI AOP的 容器类框架 spring mvc:spring mvc 是一个mvc框架 mybatis:是一个orm的持久层框架 ...

  10. 实现简单网页rtmp直播:nginx+ckplayer+linux

    一.安装nginx 安装带有rtmp模块的nginx服务器(其它支持rtmp协议的流媒体服务器像easydarwin.srs等+Apache等web服务器也可以),此处使用nginx服务器,简单方便. ...