【ZOJ2278】Fight for Food(dp)】的更多相关文章

BUPT2017 wintertraining(16) #4 F ZOJ - 2278 题意 给定一个10*10以内的地图,和p(P<=30000)只老鼠,给定其出现位置和时间T(T<=1,000,000,000),求最多抓到几只老鼠. 题解 DP,f[i]表示按时间排序后抓第i个老鼠,最多能抓多少只. bfs计算每对位置之间的距离\(dis[x1][y1][x2][y2]\). \(f[i]=max(f[i],f[j]+1)\)当i,j两只老鼠的距离小于他们的时间差. j只用往前枚举50就够…
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个是用R还是不用就能确定了(如果用R那么在中间一定变成了缓冲串) 那么可以转移了 设d[i,j]表示前i个串,最近的一个M在i的前边一个格子,的最短长度,有 d[1,1]=1 d[i,i]=min{d[i-1,j]}+2 //即用一次M又补上i,所以+2 d[i,j]=d[pos,j]+1,其中pos…
题目传送门:1519 拆方块 首先,我们可以发现,如果第i堆方块被消除,只有三种情况: 1.第i-1堆方块全部被消除: 2.第i+1堆方块全部被消除:(因为两侧的方块能够保护这一堆方块在两侧不暴露) 3.第i堆方块过了h[i]次操作后,从上到下被消除. 于是我们设l[i]为第i堆方块从左边开始消除的最小操作次数,设r[i]从右边开始消除的最小操作次数. 然后从左向右dp出l[i],从右向左dp出r[i],然后就能算答案了. 代码: #include<cstdio> #include<cs…
题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各种撕烤,,,然而还是不会... 对于这道题,我第一眼的想法是用f[i][j]表示长度为i,最后一个数是j的抖动序列的方案数,然而这是个1~n的排列,似乎没法解决数字重复的问题..QAQ 于是看了一波题解,,,原来这个dp是这样子搞的:用f[i][j]表示i个数的排列.第一个数<=j且开头下降的抖动序…
Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10898   Accepted: 4591 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤…
Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13447   Accepted: 6549 Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, ea…
https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角),然后剩余空间我们只需要考虑i+1~n和j+1~m这一块空间即可(至于为什么多想想QAQ) 所以我们维护i+1~n和j+1~m能取到的最大矩形即可. 显然二维前缀和,然后再维护一个二维 mx[i][j]=max{get(i, j), mx[i+1][j], mx[i][j+1]},然后每一次找一个点i…
题目链接 DP.设last[i][j]是第i个串字符'j'所在的最后的位置,f[i][j][k]是第一个串匹配到i,第二个串匹配到j,第三个串匹配到k,最多的公共子串数. 那么我们三重循环i.j.k,每次更新last数组的值. 然后在三重循环内部再加一重循环从'a'到'z',枚举公共子串的最后一个字符是什么. 然后在last里面找到这三个字符最后出现在什么位置,记为nms. 于是f[i][j][k]=f[n-1][m-1][s-1]+1. 最后输出答案即可. #include<cstring>…
题目链接 DP果真是考思维啊 增加一个数的操作等价于删掉那个不和谐的数的操作. 所以1.2操作可以忽略. 剩下3.4操作,则可以设计f[i][j]是将区间[i,j]变成回文序列需要的操作数. if(a[i]==a[j]) f[i][j]=f[i+1][j-1]; 如果不一致的话,考虑改.删左边.删右边三种操作. #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #inc…
题目链接 此题使用DP.设f[i][j]表示数i用j个数表示,则对于所有的k<=sqrt(i),有 f[i][j]=∑f[i-k*k][j-1] 但是这样会有重复情况.所以先枚举k,再枚举i和j. 代码如下 #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<cctype> inline long long read(){ ,f=; ch…
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=show_problem&problem=2549 设w[i,j]为i-j能分割成的最少回文串 f[i]为前i个字符能够分成的最少回文串 w[i,j]=1 当w[i+1,j-1]==1 && s[i]==s[j] 或 i==j-1 && s[i]==s[j] w[i,j]=…
https://vijos.org/p/1757 有时候自己sb真的是不好说... 我竟然想了半天都没想到这个转移. 我是有多傻.... 我们设f[i][j]表示1~i的排列且逆序对恰好是j的方案数. 显然我们只需要将i放进i-1排列中就行了. 而且发现i始终大于i-1 那么就好做了,我们只要将所有i放到i-1序列的位置的方案全都加起来即可,即: f[i][j]=sum{f[i-1][k], max{0, j-i+1}<=k<=j} 用前缀和搞搞就行了. #include <cstdio…
题意:A和B玩一个游戏:A在[L,R]之间随机选取一个数X,之后由B来猜这个数, 如果猜的数比X小,则A就告诉B你猜的数小了, 如果猜的数等于X则游戏结束, 如果猜的数大于X,则在这之后A只会回答B是否猜对了,而不会告诉B是否猜小了. 问:在最坏的情况下,B猜到X时最少需要猜多少次,并输出方案数对100000073取模 L,R<=5e6 思路:少了蛋数量的鹰蛋…… f[i]表示长度为i的区间需要的询问次数 p[i]表示至少需要i次询问的最短区间长度 a[i]表示区间长度为i的最优选择方案数 i可…
题目链接 这是一道考思维的好题. 一开始设f[i][j]是i个点刚好j层的方案数,死活调不出来,看题解发现可以改为<=j层的方案数,最后输出f[n][m]-f[n][m-1]就好了. 对于计算考虑左右子树分配,设i个点分给左子树,j个点分配右子树,注意枚举顺序,乘法原理搞一搞就好. 我拼尽全力只得了57分,qwq. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm&g…
题目链接 去看STDCALL的题解吧 #include<cstdio> #include<cctype> #define mod 9999973 inline long long read(){ ,f=; char ch=getchar(); while(!isdigit(ch)){ ; ch=getchar(); } while(isdigit(ch)){ num=num*+ch-'; ch=getchar(); } return num*f; } int C(int num){…
题目链接 这题的状态转移方程真是粗鄙. f[i][j][k]表示前i行用了j个矩阵状态为k的时候的最大值. k=0:两列都不选. k=1:取左弃右. k=2:选右弃左. k=3:左右都选,但分属于两个独立矩阵. k=4:左右都选,且同属于一个矩阵. 参考题解:孤寂的时代 代码 #include<cstdio> #include<cctype> #include<cstring> inline long long max(long long x,long long y){…
题目链接 原题解 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> using namespace std; inline long long read(){ ,f=; char ch=getchar(); while(!isdigit(ch)){ ; ch=getc…
题目链接 题解 首先可以想到分组后,去掉两边都填了数的组. 然后就会剩下\((-1,-1)\)和\((-1,x)\)或\((x,-1)\)这两种情况 因为是最小值序列的情况数,我们可以考虑从大到小填数,一个组填完了最小值就是当前填的数 设\(f[i][j][k]\)表示已经填到数\(i\)剩余\(j+k\)个填了一个数的组,其中有\(j\)个组是第一种情况填出来的,\(k\)个是第二种情况来的 分情况转移 如果这个数属于第一种情况,那么可以转移到: \(f[i][j+1][k]:\)填到一个\(…
题意:有10,20,30,100四种硬币,每种数量无限,给定n个a[i],问能组成所有a[i]的硬币的最小总数量 n<=1e2,a[i]<=1e9 思路: #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair<int,int> PII; typede…
[CF1132F]Clear the String(动态规划) 题面 CF 题解 考虑区间\(dp\). 增量考虑,每次考虑最后一个字符和谁一起删去,然后直接转移就行了. #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAX 505 int f[MAX][MAX],n;char s[MAX]; int main() { scanf("%d%s…
[BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\),上一个填的数是\(j\)的最小逆序对数. 随便拿什么维护一下转移就好了. #include<iostream> #include<cstdio> using namespace std; #define MAX 10010 inline int read() { int x=0;bo…
[CF809C]Find a car(动态规划) 题面 洛谷 CF 有一个无穷大的矩阵,第\(i\)行第\(j\)列的数是\((i-1)xor(j-1)+1\),\(q\)次询问,每次询问一个矩形内数小于等于\(k\)的数的和. 题解 询问等价于\(\sum_{i=l}^r\sum_{j=L}^R [i\oplus j\le k]i\oplus j\). 把询问拆分成四个从\(1\)开始的东西,即\([1..r,1..R],[1..l-1,1..R],[1..r,1..L-1],[1..l-1,…
[BZOJ5471][FJOI2018]邮递员问题(动态规划) 题面 BZOJ 洛谷 给定平面上若干个点,保证这些点在两条平行线上,给定起点终点,求从起点出发,遍历所有点后到达终点的最短路径长度. 题解 不会做,于是点开LOJ,点开除了\(std\)之外唯一过的人的代码,照着打了一遍QwQ...... 然后再对着代码YY一遍就有了这篇东西...... 强制令起点的位置是第\(0\)行(方便而已). 在第\(0\)行枚举一个\(i\),在第一行枚举一个\(j\). 设\(f[j][0]\)表示第\…
[BZOJ5318][JSOI2018]扫地机器人(动态规划) 题面 BZOJ 洛谷 题解 神仙题.不会.... 先考虑如果一个点走向了其下方的点,那么其右侧的点因为要被访问到,所以必定只能从其右上方的点走过来.同理,如果这个点向右,那么其下方的点就只能从其左下方的点向右走过来. 因此我们可以确定所有平行于副对角线的斜线上的位置的方向都是相同的. 考虑\(n=m\)的情况,从一个点开始无论向右开始向下,都只会走到下一条对角线上,因此这个过程本质上就是就是固定了一个向下向右的序列,然后循环这个操作…
[BZOJ5314][JSOI2018]潜入行动(动态规划) 题面 BZOJ 洛谷 题解 不难想到一个沙雕\(dp\),设\(f[i][j][0/1][0/1]\)表示当前点\(i\),子树中一共放了\(j\)个,这个点是否放了,这个是否被覆盖了. 看起来直接合并是\(O(nk^2)\)的QwQ..... 然后我以为是\(O(nk^2)\)的就不会做了嘤嘤嘤. 实际上是\(O(nk)\)的... 证明大概是这样的: 考虑什么时候会产生\(O(k^2)\)的贡献,即一个点有两棵子树的大小大于\(k…
[BZOJ3193][JLOI2013]地形生成(动态规划) 题面 BZOJ 洛谷 题解 第一问不难,首先按照山的高度从大往小排序,这样子只需要抉择前面有几座山就好了.然而有高度相同的山.其实也不麻烦,把高度相同的山按照关键数字排序,这样子即使是高度相同的山,也可以变成多出位置可以放进来,只需要记录前面有多少高度相同的山就可以直接累乘了. 第二问其实也没什么,就是同高度的山要一起放,因为它们最终对于答案的贡献是相同的. 既然不能组合数直接计算答案,考虑\(dp\). 设\(f[i][j]\)表示…
[BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖动序列的连续子序列还是一个抖动序列. 如果在一个抖动序列中\(x\)与\(x+1\)不相邻,那么交换两者的位置这个序列仍是抖动序列. 如果将一个抖动序列中所有大于\(x\)的元素全部\(+1\),那么这个序列仍然是抖动序列. 一个\([1,x]\)的抖动序列可以映射到一个\([y-x+1,y]\)的…
[BZOJ1820][JSOI2010]快递服务(动态规划) 题面 BZOJ 洛谷 题解 考虑无脑四维\(dp\).\(f[i][a][b][c]\),表示当前处理到第\(i\)个任务,三辆车的位置分别在\(a,b,c\)的最小值. 发现\(a,b,c\)中一定有一个等于第\(i\)个任务的位置,显然可以再咕掉一维.这样子状态就只有三维,也就是\(O(nm^2)\),然而空间小,再滚一维就好了. 时间复杂度\(O(nm^2)\) #include<iostream> #include<c…
[BZOJ1799][AHOI2009]同类分布(动态规划) 题面 BZOJ 洛谷 题解 很容易想到数位\(dp\),然而数字和整除原数似乎不好记录.没关系,直接枚举数字和就好了,这样子就可以把整除原数的余数直接记下来,然后就很好写了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long l…
[BZOJ1487][HNOI2009]无归岛(动态规划) 题面 BZOJ 洛谷 题解 哪来的这么多废话啊,直接说一个仙人掌得了. 然后就是要你求仙人掌最大独立集了.(随便蒯份原来的代码就过了) 不过我还是重新整理一遍思路吧. 一种是裸的\(dp\),只需要额外考虑上环的影响就好了. 这种方法我们从树上的做法推广过来. 先考虑树的最大独立集,设\(f[i][0/1]\)表示当前考虑\(i\)及其子树,这个点一定不选,以及随意的最大独立集.转移的时候枚举这个点选还是不选即可. 推广到仙人掌上,相比…