仓鼠

动态规划之仓鼠吃豆子

蓝咒 提交于 2019-12-06 13:18:50
动态规划之仓鼠吃豆子 【题目】m * n的方格上,每一格存放一定数量的豆子,一只仓鼠从左下角一直吃到右上角,但仓鼠只能向右或向上走。那么仓鼠做多可以吃多少豆子? 【思路】因为仓鼠只能向左或者向上走,那么到达任意一点的豆子数量由两部分组成:该点本身的豆子beans(x,y),max{到达左边的豆子总数path(x-1,y), 到达下方的豆子总数path(x, y-1)}。 于是得到到达任意一点的豆子总数的公式P(x,y) = F(x,y) + max(P(x-1, y), P(x, y-1))。计算并记录每个点的豆子总数,同时为了避免重复计算,将计算的中间结果存储在path数组中。 【注意】 因为矩阵原点在左上角,需要对公式进行变换。P(x,y) = F(x,y) + max(P(x+1, y), P(x, y-1)); 注意边界值,这里需要注意三点,左下角的点、左边界、下边界。 #include <stdio.h> #include <stdlib.h> int max(int a, int b) { if (a > b) return a; return b; } int main() { int m, n; int i, j; int **beans; int **path; scanf("%d %d", &m, &n); /* m * n矩阵 */ beans = (int*

P3398 仓鼠找sugar[LCA]

筅森魡賤 提交于 2019-12-03 14:41:15
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c)到图书馆(d)。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友? 小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧! 解析 当然可以树剖。 一开始想用路径长作为判断依据,但总是WA,下数据发现就错那么一个两个小问,也是很玄学。。。 于是转而研究点如何作为判断依据。 对于一个这样的树链,它的两端点为 \(a,b\) ,如下图。 反过来想,如果我们要构造一条路径,使得树上某一个点到另一点的路径与现有路径相交,该如何做呢? 首先,这个点肯定要先有一部分路径连到原先的树链上吧,否则不可能相交。 构造出的路径剩下的部分只可能是这三种情况。 而如果这样构造路径就违反了树的定义。 我们发现, 构造出的路径一定有一个点在原树链上 。但是这样还是不好下手,我们并不知道如何寻找这个点。 再进一步观察,发现新路径两端点的lca一定在原树链上。而lca很容易求,爱怎么求怎么求。 因此对于原问题,我们只需要判断某一对点的lca是否在另一对点表示的树链上即可。 判断一个点是否在一条树链上很容易,如果有一个点 \(x\) ,我们要判断它是否在 \(a,b\) 构成的树链 \(

ZCMU―2155

匿名 (未验证) 提交于 2019-12-03 00:27:02
2155: F.ly的仓鼠 128 MB 18 [ Submit ][ Status ][ Web Board ] Description 上完体育课的ly很无聊,于是准备去蹭一蹭临床专业的课程,正好今天他们准备研究一些仓鼠的基因,由于操作有点出错...ly得到了一段很长很长的基因链(都是由小写字母构成),作为一个好奇心极强的人,ly有了一个问题,每次取两个区间,用这两个区间的DNA生产出来的仓鼠,会是两只一模一样的仓鼠吗? 显然小胖子ly光有好奇心并没有那个能力去得出结果...只会提问不会解答,所以又要麻烦你帮她了。 Input 第一行输入两个正整数n,q,分别代表DNA串的长度以及要询问的次数。 第二行一个字符串S,表示ly得到的DNA序列 下面q行每行输入四个整数l1,r1,l2,r2分别代表q次询问,对于每一次询问请你判断两个[l,r]区间的DNA是否相同。 Output 对于每一个询问 相同输出YES不相同输出NO Sample Input 10 5 abcaabasd 1 3 2 4 4 4 5 5 1 2 5 6 1 5 6 1 0 1 9 2 10 Sample Output NO YES YES NO NO HINT 输入数据保证:1<=length(S),q<=1000000 【分析】 题目原意是hash过的,但是可能没想到10W^2的数据没卡掉...

洛谷 P3398 仓鼠找sugar 题解

て烟熏妆下的殇ゞ 提交于 2019-11-29 17:16:58
先说一下题意: 在一颗树上一个仓鼠从a走到b,一个他的基友从c走到d求他两个是不是会有相遇的地方。 一道求lca的题目。 这道题只看题目是很难找出规律的,但是一画图他的规律就很显然了 可以发现如果两条路径如果相交那一对点的最近公共祖先一定在另一台的路径上 不然如果相交那就这能两条边交叉,这在树中是不可能出现的 否则就不是一棵树 但是怎么确定这到底是不是回相遇的呢? 可以先求出仓鼠目的地b和出发点a的最近公共祖先qwq和surger的 目的地d和出发点c的最近公共祖先awa 然后分别求出a和d,a和c,b和d,b和c的最近公共祖先来和 前面求出的两个最近公共祖先的深度比较如果有一个这两个 深度小那就是不可行的不然如果都比他深度深或者等于的话 那就是可能遇见的 但是怎么证明只要他们的最近公共祖先的深度大于等于awa和qwq 那就是可行的呢? 这个在三克油大佬的博客里面已经证明的很好啦,我就不多说了 附上链接 这里 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int Max = 100005; struct node { int y,ne; }a[Max << 1]; int head[Max]; int f[Max][22]; int tot = 0; void