声明

本文不介绍dfs、dp算法的基础思路,有想了解的可以自己找资源学习。

本文适合于刚刚接触dfs和dp算法的人,发现两种算法间的内在联系。

本人算法之路走之甚短,如果理解出现问题欢迎大家的指正,我会分享基于我目前理解到的算法思想。

dfs与dp的关系

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

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

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

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

经典例题-数字三角形 - POJ 1163

题目

The Triangle

Description

Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.

Input

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input

  1. 5
  2. 7
  3. 3 8
  4. 8 1 0
  5. 2 7 4 4
  6. 4 5 2 6 5

Sample Output

  1. 30

dfs思路


解题思路

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

通过迭代计算到最后一层,记录最后一层的所有值。

最后一层中的最大值即为所求。

具体代码

  1. #include <iostream>
  2. // use vector vessel to write down the final level
  3. #include <vector>
  4. // use 'sort' method in <algorithm>
  5. #include <algorithm>
  6. // use 'greater<T>' functional template in <functional>
  7. #include <functional>
  8. using namespace std;
  9. // the maximum of the triangle ordinal
  10. const int max_ordinal = 100;
  11. // the depth
  12. int num_of_rows;
  13. // save data
  14. int data[max_ordinal][max_ordinal];
  15. // save the data of the final level
  16. vector<int> ans;
  17. void dfs(int level, int sum, int column)
  18. {
  19. // avoid multi calculate
  20. int current_sum = sum+data[level][column];
  21. // save data which was in final level
  22. if(level+1 == num_of_rows)
  23. {
  24. ans.push_back(current_sum);
  25. return;
  26. }
  27. // binary tree
  28. dfs(level+1, current_sum, column);
  29. dfs(level+1, current_sum, column+1);
  30. }
  31. int main()
  32. {
  33. cin >> num_of_rows;
  34. for(int i = 0; i < num_of_rows; i++)
  35. for(int j = 0; j <= i; j++)
  36. scanf("%d", &data[i][j]);
  37. dfs(0, 0, 0);
  38. cout << "output data:" << endl;
  39. sort(ans.begin(), ans.end(), greater<int>());
  40. for(int i = 0; i < ans.size(); i++)
  41. {
  42. cout << ans[i] << "\t";
  43. if(!((i+1) % 5)) cout << endl;
  44. }
  45. cout << endl;
  46. return 0;
  47. }

dp思路


解题思路

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

具体代码

  1. #include <iostream>
  2. // use 'max' method and 'sort' method
  3. #include <algorithm>
  4. // use 'greater<T>' functional template
  5. #include <functional>
  6. using namespace std;
  7. // same as DFS
  8. const int max_ordinal = 100;
  9. int num_of_rows;
  10. int data[max_ordinal][max_ordinal];
  11. // the array of the dp method
  12. int dp[max_ordinal][max_ordinal];
  13. int main()
  14. {
  15. cin >> num_of_rows;
  16. for(int i = 0; i < num_of_rows; i++)
  17. for(int j = 0; j<= i; j++)
  18. scanf("%d", &data[i][j]);
  19. // dp now
  20. dp[0][0] = data[0][0];
  21. for(int i = 1; i < num_of_rows; i++)
  22. {
  23. for(int j = 0; j <= i; j++)
  24. {
  25. if(j-1 >= 0)
  26. {
  27. dp[i][j] = data[i][j] + max(dp[i-1][j], dp[i-1][j-1]);
  28. } else {
  29. dp[i][j] = data[i][j] + dp[i-1][j];
  30. }
  31. }
  32. }
  33. // calling 'sort' method
  34. sort(dp[num_of_rows-1], &dp[num_of_rows-1][num_of_rows], greater<int>());
  35. for(int i = 0; i < num_of_rows; i++)
  36. cout << dp[num_of_rows-1][i] << " ";
  37. cout << endl;
  38. cout << "answer is: ";
  39. cout << dp[num_of_rows-1][0] << endl;
  40. return 0;
  41. }

dfs与dp算法之关系与经典入门例题的更多相关文章

  1. DFS与DP算法

    名词解释: DFS(Dynamic Plan):动态规划 DFS(Depth First Search):深度优先搜索 DFS与DP的关系 很多情况下,dfs和dp两种解题方法的思路都是很相似的,这两 ...

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

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

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

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

  4. 图片大小以及dp和px关系一览表,logo尺寸

    图片大小以及dp和px关系一览表 说明:根据上表,我们应该很容易算出一张图片在不同手机上的宽和高是多少. 结论 从上表可以得出如下结论 1. 图片放在drawable中,等同于放在drawable-m ...

  5. UvaLive6661 Equal Sum Sets dfs或dp

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

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

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

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

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

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

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

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

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

随机推荐

  1. 大数据给IT企业带来攫金市场新机遇

    大数据给IT企业带来攫金市场新机遇 大数据,一个时髦的名词,也是当下热门的业务领域.大数据诱人的利益诉求点之一,即通过大数据能更好地提高效率,更好地有的放矢.一方面,大数据让公司内部更有效地运作:另一 ...

  2. MySQL数据库参数优化

    概述 最近在对各个系统的mysql做一些参数上的优化,也开了慢查询,准备后面针对特定sql再进一步优化.下面主要介绍一下一些优化的参数. 1.优化前mysql配置 可以看到基本上是没怎么做优化的. 2 ...

  3. log4j基础配置使用

    添加log4j的jar包:可以从maven处下载:https://mvnrepository.com/artifact/log4j/log4j/1.2.17 <!-- https://mvnre ...

  4. Timus 1712. Cipher Grille 题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  5. c# 编程--方法(函数)

    方法(函数) 能够独立完成某项功能的模块    函数的四要素:函数名.输入.输出.函数体    函数定义.函数的调用 函数就是将一堆代码进行重用的一种机制,函数就是一段代码,这段代码可能有输入的值(参 ...

  6. java synchronized的四种用法

    一 修饰方法 Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来 ...

  7. mysql基于Altas读写分离并实现高可用

    实验环境准备: master:192.168.200.111 slave1:192.168.200.112 slave2:192.168.200.113 Altas:192.168.200.114 c ...

  8. css3--文字效果

    text-shadow <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  9. SSM框架搭建过程

    引入依赖的jar包(pom.xml) a. <!--Spring SpringMVC相关-->  spring-webmvc b. <!--Spring事务-->  sprin ...

  10. Java集合类框架的最佳实践有哪些

    根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList. 有些集合类允许指定初始容量.因此,如果我们能估计出存 ...