DP
orzqqqqqqq
这个作者很懒,什么都没留下…
展开
-
Storage Keepers UVA - 10163
二分枚举L,可以得出最大的L,然后把所用的钱数当做背包做dp#include"bits/stdc++.h"using namespace std;const int INF = 1const int MX = 1005;const int maxn = 3e4;int V[41];int n,m;int a[41],b[41],c[41],dp[maxn+7];原创 2017-08-17 20:57:56 · 178 阅读 · 0 评论 -
codeforces 1027E. Inverse Coloring
题解: 先dp预处理出第一行,d[i][j]表示,处理到第1行的i个位置,最大连续区间为j。然后对以下每行都是要么跟上一行相同,要么跟上一行不同,所以从上往下枚举最大连续相同的区间dp即可。dp[i][j]表示处理到第i行,每行最大连续区间是j。#include"bits/stdc++.h"#define debug(x) cout<<#x<<...原创 2018-08-21 22:27:19 · 323 阅读 · 0 评论 -
Codeforces920D-Tanks
题解:dp求出(sum(a[i]) - V)%K的方案,那么剩下的数就能凑成V%K的方案数。但是只有合并没有分离dp是求不出方案数的,但是答案却是有方案的。这个特殊判断(先全部合并然后再分开)例子:6 11 36 6 6 6 6 6#include"bits/stdc++.h"using namespace std;int n,K,V;const int MX = 5e3+...原创 2018-08-25 21:41:26 · 212 阅读 · 0 评论 -
csuoj 2169: 排列
状压dp,按排好序的数组依次填入dp#include"iostream"#include"cstdio"#include"cstring"#include"vector"#include"algorithm"using namespace std;typedef long long LL;const LL INFLL = 0x3f3f3f3f3f3f3f3f;int n,m;...原创 2018-09-13 19:37:16 · 262 阅读 · 0 评论 -
CodeForces Gym 101669 B - Bricks
题解: 手动模拟可以知道其实与事件发生的先后顺序没有关系(所以从左到右枚举就好了),f[i]表示前面位置的方块已经全部落下,并且i位置以前造成了i-s[i]个空位的方案数。而num[i]表示之前决策中包含i个空位置的决策总数。#include"bits/stdc++.h"using namespace std;const int MX = 1e6+7;const in...原创 2018-10-14 20:26:14 · 361 阅读 · 0 评论 -
gym 101775 H - Mr. Panda and Birthday Song
题解: ①我们要找到是否存在一种(连续元音字母的长度>=x的填字母的方法,或者连续辅音字母的长度>=y的方法)满足一种就存在一种DISLIKE的songs。这种情况直接贪心就好,‘?’的地方全填元音,或者全填辅音。 ②我们还要找到一种情况(连续的元音字母的长度<x并且连续的辅音字母的长度<y)这种填字母方式要同时满足两种情况。考虑到...原创 2018-10-17 19:52:32 · 567 阅读 · 0 评论 -
codeforces 1031D. Minimum path(bfs+dp)
题解:bfs的时候考虑下那k个可以改变的次数用完没就好了,然后边dp边记录答案,d1代表走到当前格子需要多少步,d2代表走过的格子中有多少已经是'a'了,说明不需要变换,则,d1-d2代表有多少格子不为'a'的。那么当d1-d2 <= k时,之前的全部都能变成'a'#include<bits/stdc++.h>#define mp make_pair#define ...原创 2018-10-30 15:47:13 · 285 阅读 · 0 评论 -
gym 100520 C. Catalian Sequences
bfs打表,状态数有点多,需要剔除掉无用的状态才不会t。i——当前序列长度A——题目中所给,相邻的两个数ai+1 > ai的个数low——下次添加数最低从哪个开始s——用了哪些数last——上一个以哪个数结尾。#include<bits/stdc++.h>using namespace std;typedef long long ll;const ...原创 2018-11-11 19:02:54 · 187 阅读 · 0 评论 -
gym 100520E
dp[ i ] [ j ]表示当前考虑在第i个位置填第j个数的最小值,那么dp[ i ] [ k ]应该由dp[ i-1 ] [ j ]转移过来。而不同的位置的后一个数可以填的数是有限制的。根据题意可以填的数,相邻的两个位置,左右一定对应一个相等的区间长度(且一定是2的次幂)。这个范围内表示可以相邻的数。并且这样的情况不会出现(在i这个位置填k,并且k在之前的i'位置出现过)。#includ...原创 2018-11-11 21:45:14 · 102 阅读 · 0 评论 -
gym 100524B. Bipartite Bicolored Graphs
#include"bits/stdc++.h"using namespace std;typedef long long ll;const int MX = 105;const int mod = 175781251;ll dp[MX][MX],c[MX][MX],sum[MX],res[MX],p3[MX];void init(){ int n = 100; p...原创 2018-11-15 20:30:29 · 195 阅读 · 0 评论 -
gym 100524 E. Ebola Virus
dp[ i ][ j ]状态代表必须要从左走到右,再从右走到左,然后i——j所有村庄救完。#include"bits/stdc++.h"using namespace std;typedef long long ll;const int MX = 3003;const ll INFLL = 0x3f3f3f3f3f3f3f3f;int n;ll dp[MX][MX],f[MX],...原创 2018-11-15 22:10:02 · 177 阅读 · 0 评论 -
codeforces 1089A.lice the Fan(记忆化搜索dp)
题解:主要在于第五局的时候比赛次数不一样了,所以多开一维专门代表时候打满了5场。dp[0]代表没打满五场,1代表打满了5场][胜了wa场] [败了wb场] [共赢了na个球] [共输了nb个球]。#include"bits/stdc++.h"using namespace std;const int MX = 202;int dp[2][5][5][MX][MX];struct...原创 2018-12-04 21:18:12 · 238 阅读 · 0 评论 -
2019 计蒜之道 复赛 A. 外教 Michale 变身大熊猫
题意: 求每个数在最长上升子序列中出现的概率。题解: 首先求出最长上升子序列有那些数,通过二分+dp可以求出最长上升子序列中每个数,是出现在哪个位置上,然后出现在同一位置的数的值一定的从大到小的。所以对于位置假设你当前选的是x[i][j]的后一个位置i+1可以选择的数一定是靠前出现的,因为后面出现的数可能比x[i][j]要小。根据此性质从后往前dp算可以填x[i][j]上去...原创 2019-07-10 16:41:41 · 140 阅读 · 0 评论 -
codeforces 1194F. Crossword Expert
题解: 首先可以想到dp[i][j]状态:i代表准备完成第i件事,总共用了j个单位时间的总概率,转移方程为dp[i][j] = 1/2(dp[ i-1 ][ j-t[i] ] + dp[ i-1 ][ j-t[i]-1 ]。第二维T非常大,先考虑优化第二维,第二维有一部分的值总是固定的那就是ti的前缀和。ti前缀和那部分不用算在状态里。所以重新定义状态:dp[i][j]状态:i代表准备完...原创 2019-07-15 10:20:33 · 400 阅读 · 2 评论 -
gym 100518 F. Funny Card Game
题解:dp[j][i]表示前i个数分了j块,pos[j][i]表第j块的起始位置在哪(即在哪个地方插入一个隔板)。 转移方程: ①dp[j][i]可以从dp[j][i-1]转移过来,表示当前i这个位置的值贡献不是最优。 ②dp[j][i]从前面某个值相同的位置转移过来。对于值相同的的位置,可以再开一个数组ans[],与ans...原创 2018-08-31 22:01:24 · 205 阅读 · 0 评论 -
hdu 6357Hills And Valleys
分成三段:第一段递增,第二段有上下界,递减,第三段递增。可以预处理出第一段和第三段,然后第一段与第二段进行dp#include <bits/stdc++.h>using namespace std;const int MX = 1e5+7;int n;int pre[MX][10],suf[MX][10];int f[2][10][10][10];int po...原创 2018-08-07 00:17:50 · 270 阅读 · 0 评论 -
基环外向树dp
2878: [Noi2012]迷失游乐园Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1155 Solved: 625[Submit][Status][Discuss]Description放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩。进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点、m原创 2017-08-11 12:42:10 · 557 阅读 · 0 评论 -
UVA-1627
(二分图染色+01背包),若两人中至少有其中一人不认识对方则建立一条边。#include"cstdio"#include"iostream"#include"algorithm"#include"cstring"#include"vector"using namespace std;const int MX = 1e5+7;const int maxn = 505;struct e原创 2017-08-12 17:19:48 · 227 阅读 · 0 评论 -
Gym-101498K
K. Two Subarraystime limit per test2.0 smemory limit per test256 MBinputstandard inputoutputstandard outputIn this problem, subarray is defined as non-empty seq原创 2017-08-27 17:20:18 · 538 阅读 · 0 评论 -
hdu3001
TravellingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8036 Accepted Submission(s): 2621Problem DescriptionAfter coding so man原创 2017-08-12 19:48:37 · 220 阅读 · 0 评论 -
POj 3420 (轮廓线dp)
题目链接:http://poj.org/problem?id=3420可以先用dfs构造相邻两行的状态转移矩阵,然后矩阵快速幂加速#include"cstdio"#include"cstring"#include"iostream"#include"algorithm"using namespace std;typedef long long LL;const int maxn原创 2017-08-30 13:20:41 · 208 阅读 · 0 评论 -
Codeforces 935E.Fafa and Ancient Mathematics-树形dp
题解:在dfs中把字符串拆成一颗二叉树,dp记录当前节点的最小值和最大值dp[i][j].mi表示第i个节点用了j个min(n,m)个(加号/减号)的最小值。dp[i][j].ma表示........的最大值。#include"bits/stdc++.h"using namespace std;const int inf = 1e9+7;const int MAXN = 1e4+7;int...原创 2018-03-14 14:46:12 · 185 阅读 · 0 评论 -
OpenJudge1793:矩形覆盖
解法:状压dp,状态转移有2种①:当前集合从2个不相交的集合得来O(3^n)②:当前集合从相交的集合得来,但只有一个点重合,且不重合的点也只有一个,纸上画一下就知道。#include"bits/stdc++.h"using namespace std;const int inf = 0x3f3f3f3f;struct point{ int x,y; point(){} ...原创 2018-03-21 23:55:42 · 365 阅读 · 0 评论 -
hdu6279 Circular Coloring
Circular ColoringTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 28 Accepted Submission(s): 10Problem DescriptionBobo considers (n+m) balls...原创 2018-05-23 23:26:34 · 799 阅读 · 1 评论 -
[CodeForces908G]New Year and Original Order
题目链接:http://codeforces.com/problemset/problem/908/G题解:dp[i][j][x][l]代表前i个数中有j个数>=x, l代表是否已经抵达n这个数的边界。num = dp[i][j][x][0]+dp[i][j][x][1]代表前i个数中有j个数>=x的总方案数。如果某一位上为3,则3>=1, 3>=2, 3>...原创 2018-07-18 16:44:41 · 250 阅读 · 0 评论 -
2018牛客网暑期ACM多校训练营(第一场)E.Removal
设 next(i, c) 表示位置 i 后第一个字符 c 的位置 f(i, j) 表示当前匹配到 i,删了 j 个,不同的方案数 转移时枚举下一个字符 c,转移到 f(next(i, c), j + next(i, c) - i-1.最后答案是ans = dp[n-m][0]+dp[n-m+1][1]+......+dp[n][m].#include"bits/stdc++.h"usi...原创 2018-07-20 15:20:08 · 210 阅读 · 0 评论 -
牛客网暑期ACM多校训练营(第二场)H.travel
题解:dp[i][j][k]代表当前为第i个点,以i为根的子树上有j条链,其中有k条是跟当前根节点相连接的。故k最多为2,j最多为4。因为可能有2条同时连上i,这种是算作一条的。 因为正向跑同一个子树会统计多次,所以倒着跑。#include"bits/stdc++.h"using namespace std;typedef long long LL;const int MX = 4e5...原创 2018-07-22 20:36:50 · 309 阅读 · 0 评论 -
hdu 6327 I. Random Sequence
题解:定义dp状态f[N] [gcd(a[i-2],a[i-1],a[i])] [gcd(a[i-1],a[i])] [a[i]]。但是很多状态是没有用到的,实际上对于m=100时后面三维加起来也不会超过2000,a[i]是gcd(a[i-1],a[i])整数倍,gcd(a[i-1],a[i])是gcd(a[i-2],a[i-1],a[i])的整数倍。状态转移时枚举新的一维,转移方程为:...原创 2018-07-31 11:02:30 · 188 阅读 · 0 评论 -
gym101964A Numbers
题解:搜索剪枝,特殊情况记忆化搜索,这题写了好久啊,例子:99999999999999999,这个跑出来答案有800000000。8亿,单纯的搜索肯定会t的,可以大概验证一下如果两个加数的长度不一样那么,方案数是很少的这种情况考虑搜索剪枝,而如果长度是一样的考虑记忆化搜索。那么如何剪枝呢?我们枚举一个加数(记为a)的位数最高位,那么同样知道这个加数的最低位。同理我会知道另外一个加数...原创 2019-09-19 23:55:07 · 289 阅读 · 1 评论