dfs
林黛玉倒拔垂杨柳
你我最后也平凡到自命不凡
展开
-
AcWing 171 送礼物 (双向dfs+ 剪枝 + 二分)
题目描述:达达帮翰翰给女生送礼物,翰翰一共准备了N个礼物,其中第i个礼物的重量是G[i]。达达的力气很大,他一次可以搬动重量之和不超过W的任意多个物品。达达希望一次搬掉尽量重的一些物品,请你告诉达达在他的力气范围内一次性能搬动的最大重量是多少。输入格式第一行两个整数,分别代表W和N。以后N行,每行一个正整数表示G[i]。输出格式仅一个整数,表示达达在他的力气范围内一次性能搬动的最大重量。数据范围1≤N≤46,1≤W,G[i]≤231−1解题思路:我们可以先选n/2个物品,让他们自由原创 2020-10-15 19:14:19 · 123 阅读 · 0 评论 -
[SCOI2009]生日快乐 dfs
题目链接:点此跳转题目描述:给一块矩形蛋糕,要求切成等面积的n个矩形,且长宽比的最大值最小。解题思路:因为 n 的取值范围是 n<=10 ,所以很容易想到 dfs递归或者是二进制枚举,因为涉及到浮点数,我们这里使用的是dfs,枚举切的每一刀切的位置即可,如果是从宽x开始切的话,这一块为 x / n * i ,另一块就是 x / n * (n-i)Code:#include<iostream>#include<cstring>#include<algorithm原创 2020-10-07 12:24:04 · 106 阅读 · 0 评论 -
HDU2196- Computer (树形DP/ 树上点可到的最远距离)
Computer题目大意:就是求树上每个点可到的最远距离,(不是树的直径)是单向可走的最远距离。解题思路:虽然不是树的直径但是也和树的直径有着一定的关系,在树形dp求树的直径中,f数组求的是该节点到子树的最远距离,这里我们也用到了这个东西。不过我们又新建了两个数组。dp[i][0] 表示以 i 为根的子树上的节点到 i 的最长距离。 //之前的f数组dp[i][1] 表示以 i 为根的子树上的节点到 i 的次长距离。dp[i][2] 表示从 i 向父亲节点能走的最长距离。 //第二次dfs解原创 2020-08-10 21:24:57 · 281 阅读 · 0 评论 -
CodeForces - 1118F1 Tree Cutting (Easy Version) (树形dp/dfs+思维)
Tree Cutting (Easy Version) 题目大意:有一颗树,每个节点有三种颜色,红蓝或者无色,问你怎样分割可以把树分成两半并且红色还有蓝色分别位于两边。解题思路:首先我们先记录一下红蓝节点分别有多少个,然后跑一遍dfs记录每个节点的子树上的红蓝节点的个数,最后遍历一下,如果红色节点=x蓝色 =0,或者红色=0蓝色=y,ans++即可Code:#include <iostream>#include <cstdio>#include<cmath>原创 2020-08-09 11:59:38 · 201 阅读 · 0 评论 -
codeforces 1083 A. The Fair Nut and the Best Path(树形dp)
题目大意:每个节点都给定一个值a[i],从一个节点走到另一个节点会消耗固定值w,但也会得到这个节点的价值,问怎样走才能得到最大的价值。解题思路:这个题和树形dp求树的直径差不多(树形DP基本都是相通的),f[X] 代表以x点为根节点,到子树叶子点可以获得的最大权值Code:#include <iostream>#include <cstdio>#include<cmath>#include <cstring>#include <algo原创 2020-08-09 11:11:41 · 142 阅读 · 0 评论 -
剑指offer: [POJ]2631 The Fair Nut and the Best Path 树形DP的方式求解树的直径
题目大意: 树上有村子,求最远两个村子的距离解题思路:很显然这是一个裸的树的直径,有很多种方法可以求解,这些写一下树形DP的解法首先定义一个F数组,f[x]的含义是以x点为根节点,到最远的子树叶子点距离,然后每个点都跑一遍即可。Code:#include <bits/stdc++.h>typedef long long ll;using namespace std;const int N=10010;struct node { int v,w; node() {}; no原创 2020-08-09 09:53:51 · 156 阅读 · 0 评论 -
2020暑假牛客多校第九场 K The Flee Plan of Groundhog (树形结构/思维)
The Flee Plan of Groundhog 题目大意:有一个土拨鼠在节点1,一个橘子在节点n,在t时刻之前土拨鼠向着n走,橘子不动,从t时刻开始,橘子开始抓土拨鼠,土拨鼠开始跑,土拨鼠 1m/s 橘子 2m/s,问还有多长时间橘子才能抓到土拨鼠。解题思路:t 时刻之后,土拨鼠必然朝着n的反方向移动,土拨鼠走一步,橘子走两步,那么我们可以记录一下t时刻土拨鼠的位置,还有土拨鼠向反方向最多能跑多远。如果土拨鼠向后跑了一步就到头了,那么显然时间是橘子到改点的距离/2向上取整,但是如果土拨鼠可以向原创 2020-08-08 20:13:10 · 995 阅读 · 3 评论 -
PAT1018 公共自行车管理 (图论/最短路dijkstra变形/贪心/dfs)
公共自行车管理题目大意:每个结点中自行车存放的数量小于C/2向下取整的话就加到C/2,大于C/2向下取整的话就减到C/2给一个起点(0),给一个终点(S)然后有三个条件 首先要路径最短 在此基础上最初带去的自行车越少越好 在此在此基础上最终带回来的自行车越少越好解题思路:首先跑一下最短路dijkstra是没问题的,但是这个只能筛选出满足第一个条件的路径,所以要变形一下,记录一下从起点(0)到各个点的最短距离dist[i] ,然后如果dist[i]+g[i][s] (i到S(终点)的距离)原创 2020-08-07 00:07:50 · 154 阅读 · 0 评论 -
2020牛客暑期多校训练营(第八场)I题 Interesting Computer Game(离散化+图论dfs)
Interesting Computer Game题目大意:给出n对 a[i] , b[i] ,每次可以选择一个之前没有选择过的数,问最多能选几个。解题思路:因为每次只能从a[i] b[i]中选一个,可以把a[i]和b[i]用一条线连接起来,只能选择该线左端点或者右端点,然后把n对a[i] b[i]都链接起来,这样就形成了多个联通块。对于每个联通块进行单独判断,可以把它当成成类似树的数据结构,有n个节点,大于等于n-1条边,如果是n-1条边的话,显然只能选择n-1个点,如果大于n-1条边的话,那么原创 2020-08-04 11:30:03 · 134 阅读 · 0 评论