dfs

POJ1664 放苹果 (DFS)

a 夏天 提交于 2020-03-26 18:31:47
Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sample Input 1 7 3 Sample Output 8 其实这道题如果你有这个耐心的话,自己在纸上列举出所有状态结果也是可行的,但这样做就不符合我们ACM的风格了 这道题可以采取递归的思想,分为两种状况,n为苹果数,m为盘子数 第一:当n<m时,那么就是将n个苹果分到n个盘的方法 第二:n>=m时,那么1.将至少其中一个盘不放,那么就是n个苹果放到m-1个盘的方法 2.每个盘放一个,然后就是n-m个放在m个盘的放法 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 int solve(int n,int m) 7 { 8 if(n == 1 || m == 1 || n == 0) 9 return 1; 10 if(n<m) 11 return solve(n,n); 12 else

poj--1579--(DFS+记忆化搜索之经典)

末鹿安然 提交于 2020-03-26 07:20:50
记忆化搜索 记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用 动态规划 的那种思想和模式作一些保存。 一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。 更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。 记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来, 以后再次遇到这个状态的时候,就不必重新求解了。 这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。 虽然不能使用传统意义上的动态规划解决本题,但动态规划的思想仍然能起到作用。搜索相对于动态规划最大的劣势无非就是重复计算子结构,所以我们在搜索的过程中,对于每一个子结构只计算一次,之后保存到数组里,以后要用到的时候直接调用就可以了,这就是我要介绍的记忆化搜索。 记忆化搜索的实质是动态规划,效率也和动态规划接近,形式是搜索,简单直观,代码也容易编写,不需要进行什么拓扑排序了。 可以归纳为:记忆化搜索=搜索的形式+动态规划的思想 如下例: #include<stdio.h> #include<stdlib.h> #include<string.h> //using namespace std; int arr[22][22][22]; int sum(int a,int b,int c){ if(a<=0||b<=0|

uva1103

白昼怎懂夜的黑 提交于 2020-03-25 17:02:42
进制转换+DFS(连通块) 链接: https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=258&page=show_problem&problem=3544 先分离成一个一个的块,之后在每个块里找空白,走过的块就标记成-1; ans存答案,str是对应字典序输出,change 进制转换数组; 在变量中找不变量,每个图形里的空白块数量都不同; 两个dfs,一个标记空白快,一个标记走过的块; 代码: #include <iostream> #include <cstring> #define mes(a) memset(a,0,sizeof(a)) using namespace std; int a[210][210]; int ans[8];//存有几个相同的图按字典序输出 char str[]={'A','D','J','K','S','W'};//字典序 int change[][4]={ {0,0,0,0}, {0,0,0,1}, {0,0,1,0}, {0,0,1,1}, {0,1,0,0}, {0,1,0,1}, {0,1,1,0}, {0,1,1,1}, {1,0,0,0}, {1,0,0,1}, {1,0,1,0}, {1,0,1,1}, {1,1,0,0}, {1,1

Ehab's Last Theorem (dfs树+鸽巢原理)

狂风中的少年 提交于 2020-03-25 13:22:17
题意: 给你n个点和m条边,让你找一个大于等于 ⌈ √n ⌉ 的环或找一个点数等于 ⌈ √n ⌉ 的独立集 链接: https://codeforces.com/contest/1325/problem/F 思路: 根据dfs树的原理,相同深度的点之间必定没有边相连,我们将点的深度从 0到 ⌈ √n ⌉-1进行划分,根据鸽巢原理,必定存在一个深度满足这个深度的点的数量 大于等于 ⌈ √n ⌉ 。 代码: #include <bits/stdc++.h> #include<windows.h> using namespace std; typedef long long ll; const int MAXN=2e5+5; const int INF=0x3f3f3f3f3f3f3f; const int mod=998244353; int head[MAXN],tot,limit; struct node { int to,nxt; } e[MAXN<<2]; void add(int x,int y) { e[tot].to=y; e[tot].nxt=head[x]; head[x]=tot++; } void add_edge(int x,int y) { add(x,y); add(y,x); } int fa[MAXN],num[MAXN],dep[MAXN]; void

使用python+hadoop-streaming编写hadoop处理程序

扶醉桌前 提交于 2020-03-24 22:51:46
Hadoop Streaming提供了一个便于进行MapReduce编程的工具包,使用它可以基于一些可执行命令、脚本语言或其他编程语言来实现Mapper和 Reducer,从而充分利用Hadoop并行计算框架的优势和能力,来处理大数据 好吧我承认以上这句是抄的以下是原创干货 首先部署hadoop环境,这点可以参考 http://www.powerxing.com/install-hadoop-in-centos/ 好吧原创从下一行开始 部署hadoop完成后,需要下载hadoop-streaming包,这个可以到http://www.java2s.com/Code/JarDownload/hadoop-streaming/hadoop-streaming-0.23.6.jar.zip去下载,或者访问http://www.java2s.com/Code/JarDownload/hadoop-streaming/选择最新版本,千万不要选择source否则后果自负,选择编译好的jar包即可,放到/usr/local/hadoop目录下备用 接下来是选择大数据统计的样本,我在阿里的天池大数据竞赛网站下载了母婴类购买统计数据,记录了900+个萌萌哒小baby的购买用户名、出生日期和性别信息,天池的地址https://tianchi.shuju.aliyun.com/datalab/index

【网易】2018校招笔试题

坚强是说给别人听的谎言 提交于 2020-03-24 19:01:40
一丶魔法币 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。 魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币 小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。 思路:一开始DFS搜索 即使最深30层 也只拿了60分 操作一,一定使当前数变成奇数    操作二,一定使当前数变成偶数 每次对当前数进行判断 是由哪一步变来的 倒退回去即可 1 #include <cstdio> 2 #include <cctype> 3 4 const int MAXN=1000010; 5 6 int n,tot; 7 8 int a[MAXN]; 9 10 bool flag; 11 12 bool DFS(int x) { 13 if(x>n) return false; 14 if(x==n) return true; 15 if(DFS(2*x+1)) {a[++tot]=1;return true;} 16 if(DFS(2*x+2)) {a[++tot]=2;return true;} 17

树上子链(树的直径)

女生的网名这么多〃 提交于 2020-03-21 02:57:16
链接: https://ac.nowcoder.com/acm/contest/4462/B 来源:牛客网 题目描述 给定一棵树 T ,树 T 上每个点都有一个权值。 定义一颗树的子链的大小为:这个子链上所有结点的权值和 。 请在树 T 中找出一条最大的子链并输出。 输入描述: 第一行输入一个 n,1≤n≤10 5 。 接下来一行包含n个数,对于每个数 ai,−10 5 ≤ai≤10 5 ,表示 i 结点的权值。 接下来有n-1行,每一行包含两个数u,v( 1≤u,v≤n , u != v),表示u与v之间有一条边。 输出描述: 仅包含一个数,表示我们所需要的答案。 输入 5 2 -1 -1 -2 3 1 2 2 3 2 4 2 5 输出 4 说明 样例中最大子链为1 -> 2 -> 5 备注: 一个结点,也可以称作一条链 最开始写的有点麻烦(可忽略): 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include

[知识点]动态规划基础

ぃ、小莉子 提交于 2020-03-20 16:30:51
一、前言 最近又做了一些比较基础的DP,感觉自己无敌了,应该有资格写篇文章来介绍了! 本文主要介绍动态规划的概念,记忆化搜索以及动态规划的核心。 二、介绍 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。其本质是将一个复杂的问题拆分成若干个相对简单的子问题,所以常适用于有重叠子问题和最优子结构问题。 这样介绍动态规划是很空洞而抽象的,我们从更简单的方式切入。 三、记忆化搜索?动规? 山洞里有 m 株不同的草药,第 i 株草药的价值为v[i],采第 i 株草药需要时间 t[i]。在时间 T 内,要求采集一些草药,使总价值最高。 不知道动规碰到这道题的唯一方法为 暴力搜索 ——进行DFS,对于每一株有选与不选两个选项,从第 1 株开始逐一进行二选一,如果出现时间超过限定则回溯;直到对 m 株都进行了选择,记录当前的价值并和最大价值比较,选择较大值,以此反复,可得最优解。核心代码如下: 1 void dfs(int o, int ot, int ov) { 2 if (ot > T) return; 3 if (o == m + 1) { 4 ans = max(ans, ov); 5 return; 6 } 7 dfs(o + 1, ot, ov); 8 dfs(o + 1, ot + t[o],

连通图练习总结

强颜欢笑 提交于 2020-03-20 08:04:18
连通图是图论基于联通的一个概念,在ACM中针对图论的考察一部分是也是基于连通图。针对这类问题的解题基本思路就是先求出对应的连通分量(有向图的强连通,无向图的双连通)对图进行简化,然后再结合其他算法计算。 1. POJ 3180 The Cow Prom 这个题如果能理解题目的话,怎么做就很明显了,能形成一个可以转圈的小群,就相当于一个强连通分量,需要注意的就是这个小群不可以只有一头牛。 #include <set> #include <map> #include <list> #include <stack> #include <queue> #include <ctime> #include <cmath> #include <cstdio> #include <vector> #include <string> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #pragma comment(linker, "/STACK:1024000000,1024000000") #define IT iterator #define PB(x) push_back(x) #define CLR(a,b) memset(a,b,sizeof(a)) using namespace

图--DFS求连通块

允我心安 提交于 2020-03-20 08:03:43
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is to determine how many different oil deposits are contained