DFS与DP算法

article/2025/9/13 8:39:23

名词解释:

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思路:

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

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

具体代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <functional>
 5 using namespace std;
 6 
 7 // the maximum of the triangle ordinal
 8 const int max_ordinal = 100;
 9 // the depth
10 int num_of_rows;
11 // save data
12 int data[max_ordinal][max_ordinal];
13 // save the data of the final level
14 vector<int> ans;
15 
16 void dfs(int level, int sum, int column)
17 {
18   // avoid multi calculate
19   int current_sum = sum+data[level][column];
20   // save data which was in final level
21   if(level+1 == num_of_rows)
22   {
23     ans.push_back(current_sum);
24     return;
25   }
26   // binary tree
27   dfs(level+1, current_sum, column);
28   dfs(level+1, current_sum, column+1);
29 }
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 
38   dfs(0, 0, 0);
39   cout << "output data:" << endl;
40 
41   sort(ans.begin(), ans.end(), greater<int>());
42   for(int i = 0; i < ans.size(); i++)
43   {
44     cout << ans[i] << "\t";
45     if(!((i+1) % 5)) cout << endl;
46   }
47   cout << endl;
48 
49   return 0;
50 }

DP思路:

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

具体代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <functional>
 4 using namespace std;
 5 
 6 // same as DFS
 7 const int max_ordinal = 100;
 8 int num_of_rows;
 9 int data[max_ordinal][max_ordinal];
10 // the array of the dp method
11 int dp[max_ordinal][max_ordinal];
12 
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 
20     // dp now
21     dp[0][0] = data[0][0];
22     for(int i = 1; i < num_of_rows; i++)
23     {
24         for(int j = 0; j <= i; j++)
25         {
26             if(j-1 >= 0)
27             {
28                 dp[i][j] = data[i][j] + max(dp[i-1][j], dp[i-1][j-1]);
29             } else {
30                 dp[i][j] = data[i][j] + dp[i-1][j];
31             }
32         }
33     }
34 
35   // calling 'sort' method
36     sort(dp[num_of_rows-1], &dp[num_of_rows-1][num_of_rows], greater<int>());
37     for(int i = 0; i < num_of_rows; i++)
38         cout << dp[num_of_rows-1][i] << " ";
39     cout << endl;
40     cout << "answer is: ";
41     cout << dp[num_of_rows-1][0] << endl;
42 
43     return 0;
44 }

 

转载于:https://www.cnblogs.com/WPF-342201/p/11387640.html


http://chatgpt.dhexx.cn/article/UV1Ntq6Z.shtml

相关文章

​Python—数据结构与算法​---动态规划—DP算法(Dynamic Programing)

我们一路奋战&#xff0c; 不是为了改变世界&#xff0c; 而是为了不让世界改变我们。 目录 我们一路奋战&#xff0c; 不是为了改变世界&#xff0c; 而是为了不让世界改变我们。 动态规划——DP算法&#xff08;Dynamic Programing&#xff09; 一、&#x1f3d4;斐波那契…

XDOJ(智慧平台)--分配宝藏(用动态规划dp算法解决)(C语言)

------------------------------------------------------------ 作为西电渣渣&#xff0c;这是我第一次接触需要一些很明确的算法的题目。 第一次博客写废话较多hhh&#xff0c;可以直接到下面看分析 我在昨天晚上和舍友一起肝这道题&#xff0c;肝了一个晚上都没有解决&…

dp算法篇Day1

"多希望有人来陪我&#xff0c;度过末日啊~" 讲讲我为什么突然想更新这篇栏目。 想想自己也算 "系统" 接触计算机这个学科也有差不多一年了&#xff0c;回想起当初下定决心要全身心投入到这个专业或者说行业中来&#xff0c;现在到了这样的地步&#xff0c…

第十四周DP算法总结

这周自己主要再看DP算法的博客&#xff0c;感觉DP这一部分内容确实比之前的都要麻烦一些&#xff0c;最后攻克这一部分难题还是挺好的。 这周自己总结了一些题型&#xff0c;以及一些方法思路&#xff0c;最后再把动态规划和之前的分治和贪心做一下比较。下面是详细的总结。 动…

DP算法(Dynamic Programming,俗称动态规划)是最经典算法之一

DP算法&#xff08;Dynamic Programming,俗称动态规划&#xff09;是最经典算法之一.本笔记以耳熟能详的数塔问题为引子,深入讨论01背包的解决方法. 首先,如下图所示,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少&#xff1f; 这个问题,对…

DP算法:动态规划算法

步骤 &#xff08;1&#xff09;确定初始状态 &#xff08;2&#xff09;确定转移矩阵&#xff0c;得到每个阶段的状态&#xff0c;由上一阶段推到出来 &#xff08;3&#xff09;确定边界条件。 例题 蓝桥杯——印章&#xff08;python实现&#xff09; 使用dp记录状态&#x…

动态规划(DP)算法初识

先用大白话来说一下几种经典算法大概的意思&#xff1a; 贪心算法&#xff1a;我就一次机会&#xff0c;为了达到目的&#xff0c;其他的我啥也不考虑回溯算法&#xff1a;我有无数次机会&#xff0c;还能怕我有达不到目的的时候&#xff1f;动态规划算法&#xff1a;我能随意…

常用十大算法_动态规划算法(DP)

动态规划算法&#xff08;DP&#xff09; 高能预警&#xff1a;DP算法不容易理解&#xff0c;需要动脑筋查资料找例题 动态规划算法&#xff08;Dynamic Programming&#xff09;&#xff0c;是将复杂问题拆分成子问题&#xff0c;并在子问题的基础上&#xff0c;求解复杂问题…

动态规划算法(DP)

校招笔试面试前,大家一般都会先去牛客网上刷刷题,《剑指offer》,《leetcode》走起来,然后初次入手,发现很多不会,不会到什么程度呢,连个想法都没有,于是就去讨论区看答案,然后java大神,c++大神会给出花式解答,他们喜欢在答案前加一句,简单的dp算法,递归就可以解决…

【算法笔记】树形DP算法总结详解

0. 定义 树形DP&#xff0c;又称树状DP&#xff0c;即在树上进行的DP&#xff0c;是DP&#xff08;动态规划&#xff09;算法中较为复杂的一种。 1. 基础 令 f [ u ] f[u]~ f[u] 与树上顶点 u u u有关的某些数据&#xff0c;并按照拓扑序&#xff08;从叶子节点向上到根节点…

★动态规划(DP算法)详解

什么是动态规划&#xff1a;动态规划_百度百科 内容太多了不作介绍&#xff0c;重点部分是无后效性&#xff0c;重叠子问题&#xff0c;最优子结构。 问S->P1和S->P2有多少种路径数&#xff0c;毫无疑问可以先从S开始深搜两次&#xff0c;S->P1和S->P2找出所有路…

ubuntu安装qt

Ubuntu安装qt 到qt官网下载“qt-opensource-linux-x64-5.9.1.run” 分别安装g, build-essential, libglq-mesa-dev, libglu1-mesa-dev freeglut3-dev 输入指令&#xff1a;”sudo apt-get install g” -> “sudo apt-get install build-essential” -> “sudo apt-get i…

QT安装、构建套件(MSVC、MinGW)配置

QT安装、构建套件(MSVC、MinGW)配置 1. QT框架及QT Creator下载 登录QT官网-https://www.qt.io/download。 点击downloads for open source users 在页面最下方&#xff0c;点击Download the QT online Installer。 在安装网页的最下方处有一行小字 “We do recommend yo…

QT linux安装

转载地址&#xff1a;http://www.cnblogs.com/tangkaixuan/p/6504102.html 文章来自https://lug.ustc.edu.cn/sites/qtguide/ 1.4 Qt在Linux下安装 Qt在Linux系统里的安装要稍微复杂一些&#xff0c;因为Linux发行版众多&#xff0c;所以安装过程有些差异。 由于Linux系统都可…

Qt国内镜像安装

下载安装程序 https://download.qt.io/official_releases/online_installers/ 使用国内镜像打开安装程序 G:\下载\qt-unified-windows-x64-4.5.1-online.exe --mirror https://mirror.nju.edu.cn/qt清华源 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/win…

Qt下载与安装

一、Qt和Qt Creator的区别 Qt是C的一个库&#xff0c;或者说是开发框架&#xff0c;里面集成了一些库函数&#xff0c;提高开发效率。 Qt Creator是一个IDE&#xff0c;就是一个平台&#xff0c;一个开发环境&#xff0c;类似的比如说VS&#xff0c;也可以进行Qt开发&#xff…

Ubuntu 安装QT

一、最近这家公司接到一个订单&#xff0c;客户使用到国产操作系统&#xff0c;意味着需要使用到 Linux 系统&#xff0c;于是乎&#xff0c;之前的东西又要捡起来&#xff0c;而且&#xff0c;平时代码主要是windows 平台&#xff0c;这次需要将代码移植到linux 平台&#xff…

QT的安装------QT

由于现在的qt都是线上下载了&#xff0c;那我们就去qt的官网下载 download.qt.io 我们选择倒数第二个------archive(档案)&#xff0c;顺便学一下英文。 然后选择online install&#xff08;在线安装&#xff09; 身为先进人&#xff0c;当然选择最新的版本&#xff08;团新版…

VS+QT安装配置

心血来潮&#xff0c;装个QT&#xff0c;遇到好多问题&#xff0c;记录一下&#xff08;铭记那些踩过的坑&#xff09; 软件版本&#xff1a;vs是2022&#xff0c;qt是6.3.1 qt下载地址&#xff1a;Download Qt | Develop Desktop & Embedded Systems | Qt 点进去往下翻&…

Windows Qt安装教程

目录 一、Qt安装包下载二、Qt安装流程 一、Qt安装包下载 Qt官网&#xff1a;https://download.qt.io/ Qt官方提供的专门的资源下载网站&#xff0c;所有的开发环境和相关工具都可以从这里下载&#xff0c;Qt 官方下载网站如下图&#xff1a; 点击进入archive目录&#xff0c;…