DFS与DP算法
名词解释:
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算法的更多相关文章
- dfs与dp算法之关系与经典入门例题
目录 声明 dfs与dp的关系 经典例题-数字三角形 - POJ 1163 题目 dfs思路 解题思路 具体代码 dp思路 解题思路 具体代码 声明 本文不介绍dfs.dp算法的基础思路,有想了解的可 ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
- UvaLive6661 Equal Sum Sets dfs或dp
UvaLive6661 PDF题目 题意:让你用1~n中k个不同的数组成s,求有多少种组法. 题解: DFS或者DP或打表. 1.DFS 由于数据范围很小,直接dfs每种组法统计个数即可. //#pr ...
- 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论
一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...
- 最大子段和的DP算法设计及其效率测试
表情包形象取自番剧<猫咪日常> 那我也整一个 曾几何时,笔者是个对算法这个概念漠不关心的人,由衷地感觉它就是一种和奥数一样华而不实的存在,即便不使用任何算法的思想我一样能写出能跑的程序 直 ...
- 华为笔试——C++平安果dp算法
题目:平安果 题目介绍:给出一个m*n的格子,每个格子里有一定数量的平安果,现在要求从左上角顶点(1,1)出发,每次走一格并拿走那一格的所有平安果,且只能向下或向右前进,最终到达右下角顶点(m,n), ...
- dp算法之硬币找零问题
题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...
- C++数字三角形问题与dp算法
题目:数字三角形 题目介绍:如图所示的数字三角形,要求从最上方顶点开始一步一步下到最底层,每一步必须下一层,求出所经过的数字的最大和. 输入:第一行值n,代表n行数值:后面的n行数据代表每一行的数字. ...
- P1021 邮票面值设计(dfs+背包dp)
P1021 邮票面值设计 题目传送门 题意: 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15N+K≤15)种邮票的情况下 (假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大 ...
随机推荐
- WordPress发布文章/页面时自动添加默认的自定义字段
如果你每篇文章或页面都需要插入同一个自定义字段和值,可以考虑在WordPress发布文章/页面时,自动添加默认的自定义字段.将下面的代码添加到当前主题的 functions.php 即可: 1 2 3 ...
- C++编程入门题目--No.5
题目: 输入三个整数x,y,z,请把这三个数由小到大输出. 程序分析: 我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换, 然后再用x与z进行比较,如果x> ...
- MySQL 数据库赋权
1.进入数据库,查看数据库账户 # 进入数据库 mysql –u root –p ---> 输入密码... # 使用 mysql 库 use mysql; # 展示 mysql 库中所有表 sh ...
- 【python】numpy库和matplotlib库学习笔记
Numpy库 numpy:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fortran语言无缝结合.树莓派Python v3默 ...
- bootstrap4中bootstrap_treeview不显示图标原因以及解决办法
1.bootstrap4中bootstrap_treeview不显示图标原因 查看过大神的博客,经过自己试验,插件依赖: bootstrap/3.3.7 jquery/3.3.1 <link h ...
- Spark离线日志分析,连接Spark出现报错
首先,我的代码是这样的 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object ...
- [hdu3486]rmq+枚举优化
题意:给n个数,求最小的段数,使得每一段的最大值之和大于给定的k.每一段的长度相等,最后若干个丢掉. 思路:从小到大枚举段数,如果能o(1)时间求出每一段的和,那么总复杂度是O(n(1+1/2+1/3 ...
- webview的简单介绍和手写一个H5套壳的webview
1.webview是什么?作用是什么?和浏览器有什么关系? Webview 是一个基于webkit引擎,可以解析DOM 元素,展示html页面的控件,它和浏览器展示页面的原理是相同的,所以可以把它当做 ...
- 用python爬了厦门人才网的.net岗位
为了看看.net的就业行情怎么样,用python爬取了厦门人才网.net岗位的信息,话不多说上代码,python没学多久,如果有什么不妥请指正 import requests from bs4 imp ...
- 基于hexo创建博客(Github托管)
基于hexo的博客 搭建好的博客网站 dengshuo7412.com 搭建步骤 1.依赖文件下载 Node.js 2.Hexo的安装 3.部署到Github 4.Hexo创建博客基本操作 5.Hex ...