振兴中华(dfs or dp )】的更多相关文章

UvaLive6661 PDF题目 题意:让你用1~n中k个不同的数组成s,求有多少种组法. 题解: DFS或者DP或打表. 1.DFS 由于数据范围很小,直接dfs每种组法统计个数即可. //#pragma comment(linker, "/STACK:102400000,102400000") #include<cstdio> #include<cmath> #include<iostream> #include<cstring>…
P1021 邮票面值设计 题目传送门 题意: 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15N+K≤15)种邮票的情况下 (假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX, 使在1至MAX之间的每一个邮资值都能得到. 思路: dfs+背包dp 暴搜k种邮票,下一种邮票的取值就是上一张邮票值+1,到上一次选的最大值+1:    比如这上一次你选了1,n=3时,下一次你能选的就是2,3,4: 然后怎么确定当前选择i之后的最大值呢,就是用到背包dp,dp[i]表示…
目录 声明 dfs与dp的关系 经典例题-数字三角形 - POJ 1163 题目 dfs思路 解题思路 具体代码 dp思路 解题思路 具体代码 声明 本文不介绍dfs.dp算法的基础思路,有想了解的可以自己找资源学习. 本文适合于刚刚接触dfs和dp算法的人,发现两种算法间的内在联系. 本人算法之路走之甚短,如果理解出现问题欢迎大家的指正,我会分享基于我目前理解到的算法思想. dfs与dp的关系 很多情况下,dfs和dp两种解题方法的思路都是很相似的,这两种算法在一定程度上是可以互相转化的. 想…
名词解释: DFS(Dynamic Plan):动态规划 DFS(Depth First Search):深度优先搜索 DFS与DP的关系 很多情况下,dfs和dp两种解题方法的思路都是很相似的,这两种算法在一定程度上是可以互相转化的. 想到dfs也就常常会想到dp,当然在一些特定的适用场合下除外. dp主要运用了预处理的思想,而dfs则是类似于白手起家,一步步探索.一般来讲,能够预处理要好些,好比战争前做好准备. dfs和dp都是十分重要的基础算法,在各个竞赛中都有涉及,务必精通. 题目: T…
Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不知道我怎麼想到的 @copyright petjelinux 版權所有 觀看更多正版原始文章請至petjelinux的blog 想法 首先會感覺是樹狀DP,並且狀態是每個子樹的重心. 在建重心剖分樹的時候,我們找根為\(v\)的樹的重心的方法是看看目前節點有沒有大小大於目前樹的一半(\(size[v…
小明参加了学校的趣味运动会,其中的一个项目是:跳格子. 地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg) 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置. 一直要跳到“华”字结束. 要求跳过的路线刚好构成“从我做起振兴中华”这句话. 请你帮助小明算一算他一共有多少种可能的跳跃路线呢? 答案是一个整数,请通过浏览器直接提交该数字. 注意:不要提交解答过程,或其它辅助说…
题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写). 解法1:动态规划 定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成. 则有转移方程:dp[i] = (dp[i-1]&&f(i-1,1)) || (dp[i-2]&&f(i-2,2))     f(i,k):表示从i开始填入k个字符,这k个字符在不在元素周期表中.  dp[0] = 1 代码: //109ms 0KB #include <ios…
B. New Year and Old Property 题目连接: http://www.codeforces.com/contest/611/problem/B Description The year 2015 is almost over. Limak is a little polar bear. He has recently learnt about the binary system. He noticed that the passing year has exactly on…
Starship Troopers Problem Description You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built underground. It is actually a huge cavern, which consists of many rooms connected with tunnels. Each room is occupie…
题目链接:https://nanti.jisuanke.com/t/16447 题意: 蒜头君有一只坐骑,人马. 一天,蒜头君骑着他的坐骑走上了一片n*m的大荒野,一开始时,蒜头君在(1,1)点,他要前往(n,m)点,蒜头君的人马每次可以向右或向下移动一格.然而这片荒野并不平静,除了起点和终点外每个点都有一只怪物会袭击蒜头君. 然而蒜头君的人马强大无比,它会先对怪物造成等同于它攻击力的伤害,然后蒜头君才会受到怪物的攻击,伤害等同于怪物的攻击力.然后人马再攻击怪物,怪物再攻击蒜头君,直至怪物死去,…
题目链接: https://vjudge.net/problem/19213/origin 大致题意: 一个滑雪者想知道自己在固定高度的山坡中最多能滑的距离是多少. 思路: 首先想到的就是dfs,但是..超时了,所以我们要用到动态规划进行优化. dfs的思路就是从第一个位置开始dfs搜索. dp的思路就是数形的思维,每一个树的根节点就是dp[x][y].这是一个4叉树,当dp[x1][y1] < dp[x][y]的时候进行向下递归,每次操作加上权值1,这个操作最终会返回一个最大值. 下面是AC代…
题目描述 现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0). 请注意,砝码只能放在其中一边. 输入输出格式 输入格式: 输入文件weight.in的第1行为有两个整数n和m,用空格分隔 第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量. 输出格式: 输出文件weight.out仅包括1个整数,为最多能称量出的重量数量. 输入输出样例 输入样例#1: 复制 3 1 1 2 2 输出样例#1: 复制 3 说明 [样例说…
Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets that connect them. Heavy snow covered the city so the mayor Milan gave to the winter-service a list of streets that have to be cleaned of snow. These s…
题意: 求从不超过 N 的正整数其中选取 K 个不同的数字,组成和为 S 的方法数. 1 <= N <= 20  1 <= K<= 10  1 <= S <= 155 解题思路: DFS: 因为N,K.S的范围非常小.直接DFS就可以. /* ID: wuqi9395@126.com PROG: LANG: C++ */ #include<map> #include<set> #include<queue> #include<s…
216. Combination Sum III 保证subset.size( ) == k && target == 0的时候结束DFS subset.size( ) > k || target < 0返回. class Solution { public List<List<Integer>> combinationSum3(int k, int n) { List<List<Integer>> res = new Array…
示例1: 输入: 4 21 23 13 42 4 输出:2 说明: They can meet at place 1 or 3. 题意:从K个点到达不联通图某个点需要的最短时间,这个最短时间是这K个人最后到达的人所需的时间. 思路:(我觉得官方给的题解挺好理解的就直接复制过来了) 一句话题解:考虑距离最远的两个关键点,设它们的距离为d,d/2上取整即为答案. 必要性:这两个人要碰面,必然要走至少d/2步. 充分性:我们取两人路径中和一头距离为d/2上取整的一个点,让所有人在这相聚.如 果有一个人…
本题前面的操作别的博客里都有.难点在于颜色ci的贡献,如何一次dfs求出答案 先来考虑如何在一次dfs中单独对颜色i进行计算 用遍历dfs序的方式,在深搜过程中,碰到带有颜色 i 的点 u,u每个颜色不为i的子节点v都会贡献一个联通块, v的贡献的联通块大小是size[v]-sum{v中层次最高的以颜色i的结点为根的子树大小} 那我们要先求出v中层次最高的以颜色i的结点为根的子树大小,所以用sum表示目前为止颜色i的所有子树的大小,用last存下v进入dfs前的sum,即不算v下颜色i的子树时的…
题目连接:http://codeforces.com/contest/1263/problem/F 题意:有n个设备,上和下分别连接着一颗树,上下两棵树每棵树的叶子节点连接一个设备,两棵树的根节点都是1,1是源点可以发电供给叶结点连接的设备,现在问最多删除多少条边可以保证从根结点1发电后仍然可以使得所有设备都有电? 如上图删除红色的边(5条)仍然可以保证所有设备能供电 思路: 因为是有上下两棵树,所以对于一个设备可以供电,那么删除上面的树一部分边,要么删除下面一部分边,根据题意,我们当然要删除最…
https://www.luogu.com.cn/problem/P1025 题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5;1,5,1;5,1,1. 问有多少种不同的分法. 输入格式 n,k (6<n≤200,2≤k≤6) 输出格式 1个整数,即不同的分法. 输入输出样例 输入  输出 说明/提示 四种分法为:1,1,5;1,2,4;1,3,3;2,2,3. 解法一(DFS): DFS算是比较容易想…
https://www.luogu.org/problem/P1002 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给…
#include <iostream> #include <cstring> using namespace std; //maxv:源点能到的最远点,maxdis:最远点对应的距离, const int maxn = 1e4 + 5; struct Edge { int to, next, w; }edges[2 * maxn]; int head[maxn], maxdis,maxv, tot; void add(int u, int v, int w) { edges[tot…
传送门 \(一看肯定是区间DP(因为和和合并石子很相似,都要加n-1次)\) \(转移方程为(其中he[i][j]是i到j的和)\) \[dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+he[i][j]) \] \(问题Ⅰ.如何输出括号\) \(在转移的时候,我们可以用vis[i][j]来记录i到j合并的断点k,所以可以分别递归i至k和k+1至r\) void dfs(int l,int r) { if(l==r) return; z[l]++,y[r]++;…
题解:先从节点1开始dfs.对于每一个节点,用一个set记录:以该点为根的子树的深度. a) 如果此节点的某个子节点打出了GG,则此节点直接打出GG. b) 若set的元素个数<=1,那么,以该点为根的子树,显然是可以缩成一条链滴!且该点为链的端点.c) 若set元素个数=2,以该点为根的子树,也可以收缩成一条链,且该点不是链的端点.此时,我们继续分类讨论. i) 该点没有父亲.我们成功找到了一条链~岂不美哉. ii) 该点有父亲,那么在链上会长出一根奇怪的东西.那我们赶紧报警,把该点赋给roo…
A. Alyona and Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output After finishing eating her bun, Alyona came up with two integers n and m. She decided to write down two columns of inte…
这是找树的重心的经典题目. 树的重心有下面几条常见性质: 定义1:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心.定义2:以这个点为根,那么所有的子树(不算整个树自身)的大小都不超过整个树大小的一半.性质1:树中所有点到某个点的距离和中,到重心的距离和是最小的:如果有两个重心,那么他们的距离和一样.性质2:把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上.性质3:把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离. 方法…
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:948 解决:554 题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品.现在的问题是,John有多少种不同的选择物品的方式. 输入: 输入的第一行是正整数n (1 <= n <= 20),表示不同的…
题意:就是裸的求树的重心. #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #include<iostream> #define N 20007 #define inf 100000007 using namespace std; int n,id,mnum; int siz[N]; ],rea[N*]; void add(int u,int v) {…
//By SiriusRen #include <bits/stdc++.h> using namespace std; #define int long long ,,,,-,-,-,-,},yy[]={,-,,-,,-,,-,}; ],stk2[],stk[],C[][],Ans,top; &&y>=&&x<=n&&y<=m;} int solve(int dep){ ,lasty=,ans=; ;i<=dep;i++…
题意:给出一个$n$个点,$n-1$条边的无向连通图,给出两个点$x,y$,经过$x$后的路径上就不能经过$y$,问可以走的路径$(u,v)$有多少条,($(u,v)$和$(v,u)$考虑为两条不同的路径). 题目分析:显然这是棵树..所以从$x$到$y$只有一条简单路径.而且以$x$到$y$的路径上的点为根的话,我们发现不能走的那些点都在$x$,$y$的子树里面.这样的话,统计出$x$子树里的点有$a$个,$y$子树里的点有$b$个,那么整棵树中可以走的路径一共就有$n*(n-1)-a*b$条…
和poj3107,poj1655一样的方法 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #include<stack> #inc…