DP
河渔船
成长的小垃圾
展开
-
刷题#R12
T1 贪心模拟 从右往左,遇见m是1的位,有选或者不选两种操作:如果这一位是负数,那肯定不选更优,把这一位的二进制看做0,那么前面就可以任意选;如果选,那么sum+a[i],继续向前扫。 T2 二分答案 +DP 二分两个数之间的差的最大值 F[i]表示i不改变的最小修改的元素个数 f[i] = min(f[j] +(i-j-1), i-1) abs(A[j]-A[i]) < 二分出来原创 2017-11-05 13:56:38 · 249 阅读 · 0 评论 -
NOIP 模拟题 跳跃
C 跳跃 文件名 输入文件 输出文件 时间限制 空间限制 jump.cpp/c/pas jump.in jump.out 1s 512MB 题目描述 美丽国有 n 座小岛。这些小岛排成了一条直线,依次编号为 0,1,2,3… 有的小岛 上有金块,有的小岛上没有。美丽国有一个巨人 Bob,有一天他决定从第 0 个岛开 始,一直往后跳,看看自己能收集多少金块。 当然,Bob 不是没有目的性原创 2017-10-24 17:47:26 · 418 阅读 · 0 评论 -
洛谷10月月赛R1·浴谷八连测R1·提高组 SAC E#1 - T2一道简单题 Sequence2
SAC E#1 - T2一道简单题 Sequence2清晰版题目描述 小强拿到一个3×n的数组,要在每一列选一个数(或者不选),满足以下条件: 1.如果在第一行选,那它必须大于等于上一个数 2.如果在第二行选,那么必须小于等于上一个数 3.如果在第三行选,对于连续的一段在第三行选的数,必须满足方向相同(都小于等于上一个数或者都大于等于上一个数)20分:暴力枚举每一个位置 不选,选1,选2,选原创 2017-10-15 16:46:45 · 466 阅读 · 2 评论 -
NOIP模拟题 括号序列
题目描述 课堂上,Felix 刚刚学习了关于括号序列的知识。括号序列是一个只由左括号“(” 和右括号“)”构成的序列; 进一步的, 一个合法的括号序列是指左括号和右括号能 够 一一匹配的序列。 如果用规范的语言说明,一个合法的括号序列可以有以下三种形式: 1 S=“”(空串) ,S 是一个合法的括号序列; 2 S=XY,其中 X,Y 均为合法的括号序列,则 S 也是一个合法的括号序列;原创 2017-10-23 15:45:15 · 2343 阅读 · 0 评论 -
刷题#R3
题目链接 T1 60分可以写一些特判和暴力。 100分dp,解释一下dp的做法。 我们用f[i][j]表示跳了i次,到第j层楼然后跳下去,需要的最小花费。 还需要知道一个策略,如果跳过的楼是一样的,那么以高度升序或者降序肯定比乱跳更优。 那么我们先将所有的楼按照高度升序或者降序排一下,然后dp就可以了。 根据f数组的定义,那么f[0][i]=c[i]; 然后有 f[i][j]=原创 2017-10-30 17:11:45 · 273 阅读 · 0 评论 -
洛谷八连测 #R8
题目链接T1答案是求C1x+1∗Ck−1n−1/Ckn+xC_{x+1}^1*C_{n-1}^{k-1}/C_{n+x}^k 取得最大值时的x值。 数学题。 化简,求单调性。T2对每一门成绩都建一棵树。 每条边都加一条反向边。 能够通过正向边到达的点都是比自己成绩低的,反向边则是比自己高的。 最好成绩是只有三门成绩搜比自己高时才比自己高。 最坏成绩是只有三门都比自己低时才比自己低。原创 2017-11-07 21:02:51 · 381 阅读 · 0 评论 -
NOIP 2015 愤怒的小鸟
评测传送状态压缩+dp; 我们用f[s]表示消灭掉s这个状态的猪最少需要几次。 预处理出attack[i][j],表示穿过i,j这两只小猪的曲线能打下的猪。 那么f[s]=min(f[s],f[s^(s&attack[j][k])]);#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define LL原创 2017-10-22 10:21:32 · 257 阅读 · 0 评论 -
洛谷八连测 #R6
题目链接 T1 100做法:dp[i][j]表示后一个串匹配到了i,lcs的长度达到了j,第一个串最早能在什么地方结束。转移维护从某个位置开始的第一个某个字符在哪里。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define LL long longusing namespace std;原创 2017-11-07 11:36:52 · 290 阅读 · 0 评论 -
NOIP 2003 加分二叉树
评测传送这个题可以记忆化搜索做的。 注意边界条件。 对于先序遍历,递归就可以了(在dfs的时候用一个数组记录根节点就可以了)。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<ctime>#include<queue>#define LL long longusing nam原创 2017-10-20 15:54:04 · 359 阅读 · 0 评论 -
NOIP 2015 飞扬的小鸟
评测传送30分的搜索; 70分的裸dp; 100分的复杂度压缩。 需要注意的问题是H数组要初始化。我的代码一开始在没有到达终点而且没有飞过一颗柱子时是没有输出的,一开始在luogu,vijos上都过了,在uoj上检查出了这个小bug,已改。看了了这位大佬的博客,在此表示感谢和膜拜。 30分#include<iostream>#include<cstdio>#include<cstring原创 2017-10-20 13:52:04 · 383 阅读 · 0 评论 -
NOIP 2015 子串
评测传送一开始做就想暴力,蒟蒻的dp实在是太弱了。言归正传。 我们用f[i][j][p][0/1]表示用了a串前 i 个字符作为p段,匹配了b串前 j 个字符(0表示第i个字符没有用,1表示第i个字符用了)。 那么有f[i][j][p][0]=f[i−1][j][p][1]+f[i−1][j][p][1];f[i][j][p][0]=f[i-1][j][p][1]+f[i-1][j][p][1]原创 2017-10-20 08:54:32 · 297 阅读 · 1 评论 -
P1868 饥饿的奶牛(区间问题)
题目传送和 P1280 尼克的任务差不多 不重叠的区间最大覆盖。 dp解法。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#define LL long longusing namespace std;const int M=3000009;const i原创 2017-10-27 10:53:30 · 452 阅读 · 0 评论 -
罪犯分组
传送 果然最后还是看了题解。 正解做法: 状压dp; 用二进制表示这些个罪犯。对于 i 这个状态,用f[i]表示最少监狱数,转移方程f[i]=min(f[i],f[j]+f[i^j]); (j和i^j关于全集i的补集)。#include<iostream>#include<cstring>#include<string>#include<cstdio>#define N 66000原创 2017-10-03 11:34:00 · 244 阅读 · 0 评论 -
刷题#R7
集合集合 【问题描述】 给定一个可重集合,一开始只有一个元素 0 。然后你可以操作若干轮,每一 轮,你需要对于集合中的每个元素 x 进行如下三种操作之一: 1 、将 x 变为 1 + x 。 2 、将 x 分裂为两个非负整数 z y, ,且满足 z y x + = 。 3 、什么都不做。 每一轮,集合中的每个元素都必须进行上面三个操作之一。 对于一个最终的集合,你的任务是判断至少进行原创 2017-11-01 15:59:22 · 912 阅读 · 0 评论 -
NOIP 模拟题 天上掉馅饼
C 天上掉馅饼 文件名 输入文件 输出文件 时间限制 空间限制 bonus.pas/c/cpp bonus.in bonus.out 1s 128MB题目描述 小 G 进入了一个神奇的世界,在这个世界,天上会掉下一些馅饼。今天,天上 会随机掉下 k 个馅饼。 每次天上掉下馅饼, 小 G 可以选择吃或者不吃(必须在下一个馅饼掉下来之前 作出选择,并且现在决定不吃的话以后也不能吃) 。 馅原创 2017-10-25 17:00:03 · 535 阅读 · 0 评论 -
刷题#R6
题目链接 T1 画图可以找出规律; 所有有环的都仅有两种情况, 而树上的方案数为n种; 先跑出带环的图记下乘几个2,然后在与所有的树相乘 如果出现一个联通图中有两个及以上的环时,无论如何也不能匹配成功,那么方案数就是0 期望得分 100 T2原创 2017-11-04 21:38:52 · 261 阅读 · 0 评论 -
刷题#R14
三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口。(来自取名力为0的出题人) 具体来说,城中有无穷多个路口,每个路口有唯一的一个正整数标号。除了1号路口外,每个路口都连出正好3条道路通向另外3个路口:编号为x(x>1)的路口连出3条道路通向编号为x*2,x*2+1和x/2(向下取整)的3个路口。1号路口只连出两条道路,分别连向2号和3号路口。 所原创 2017-11-04 18:56:35 · 304 阅读 · 0 评论 -
刷题#R11
卖书 问题描述 大 C 开了一家 noip 辅导资料店,每本资料售价 5 元,且每人限购一本。前来买书的人络绎 不绝,他们带着 5 元,10 元和 20 元。可是由于启动资金有限,大 C 进完货之后手上已经没 有钱了,所以他只能用前面收的钱找钱。现在大 C 想知道他能不能成功的找钱。输入格式 第一行一个整数 n 表示来买书的人数 第二行 n 个整数表示每个人身上带的钱数,数据保证一定是原创 2017-11-04 08:17:41 · 471 阅读 · 0 评论 -
刷题#R10
T1 理解题意,模拟即可。 T2 and是递减的,or是递增的。 用倍增预处理。 然后枚举左端点,二分右端点的范围或者用倍增求右端点的范围。 建议用倍增法,因为二分好像很慢,我的二分T掉三个点,二倍增查找0.1秒。 T3 树上dp+dfs来优化。 分析:显然的,树形dp,状态也很好想到:f[i][j]表示以i为根的子树收集到j个果子的方案数.转移的话就相当于是背包问题,每个子节点可原创 2017-11-03 21:17:05 · 236 阅读 · 0 评论 -
刷题#R9
立方体 cube.in/.out/.cpp 【问题描述】 在 n 维空间中,一个单位立方体由 2^n 个点组成。 他们的坐标形如 (x 1 ,x 2 ,…,x n ),x i ∈ {0,1}。 定义 n 维空间中两点的距离为其曼哈顿距离,点 p (p 1 ,p 2 ,…,p n ) 与点 q (q 1 ,q 2 ,…,q n ) 的距离为 ∑ n i=1 |p i −原创 2017-11-03 11:10:03 · 413 阅读 · 0 评论 -
P1736 创意吃鱼法
题目传送这个题和最大正方形差不多,是它的升级版。 不同之处是这个题有约束条件:“如果某个正方形子矩阵的某条对角线上都有鱼,且此正方形子矩阵的其他地方无鱼” 那么对于以i,j为右下角的,我们处理出b[i][j]表示从i,j开始左最远有多少个连续的0,c[i][j]表示从i,j往上最多有多少个连续的0,那么就有f[i][j]=min(f[i−1][j−1],min(b[i][j−1],c[i−1][原创 2017-10-26 15:52:31 · 342 阅读 · 0 评论 -
P1417 烹调方案
题目传送做法:贪心+01背包这里贪心的方法是很重要的。类似的题目还有P1012 拼数和NOIP 国王游戏贪心的原则 a1−(t+c1)∗b1+a2−(t+c1+c2)∗b2>a2−(t+c2)∗b2+a1−(t+c1+c2)∗b1a1-(t+c1)*b1+a2-(t+c1+c2)*b2>a2-(t+c2)*b2+a1-(t+c1+c2)*b1 得到 c1∗b2<c2∗b1c1*b2<c2*b1原创 2017-10-26 11:37:39 · 275 阅读 · 0 评论 -
P1855 榨取kkksc03
题目传送二维费用的01背包。#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<algorithm>#include<cstdlib>#define LL long longusing namespace std;int n,m,T,f[209][209];int w1[109],w原创 2017-10-26 14:18:39 · 415 阅读 · 0 评论 -
P1508 Likecloud-吃、吃、吃
题目传送dp或者记忆化搜索都可以过吧。 但是我的记忆化搜索莫名其妙的WA了。 dp轻松AC.#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<algorithm>#include<cstdlib>#define LL long longusing namespace std;in原创 2017-10-26 11:10:18 · 211 阅读 · 0 评论 -
P1282 多米诺骨牌
题目传送最终还是看了题解。我一开始想的dp方程的两个状态分别表示第i个骨牌,翻转j次,记录的值为最小的差,最后扫一遍f[n],应该是可以得出答案的,然而这种做法真的可以吗???正确的解法: 我们用f[i][j]表示到第i个骨牌,得到差值为j,最小的翻转次数。 那么转移方程就出来了 f[i][j]=min(f[i−1][j−(a[i]−b[i])],f[i−1][j+(a[i]−b[i])]+1原创 2017-10-26 10:15:20 · 440 阅读 · 0 评论 -
P1280 尼克的任务
题目传送我们用f[i]表示前i-1分钟最多空闲了多少分钟。 那么对于每个任务,f[i+t[i]]=max(f[i+t[i]],f[i]); 而如果i处没有任务,那么f[i+1]=f[i]+1#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<algorithm>#include<cstd原创 2017-10-26 09:18:56 · 295 阅读 · 0 评论 -
P2066 机器分配
题目传送这个题是简单的dp+递归输出。注意一个问题,是要求字典序最小的,所以在递归时,倒着循环,而且找到一个合适的值就要break,否则就会在后面将前面的值覆盖。#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<algorithm>#include<cstdlib>#define LL原创 2017-10-26 08:07:32 · 295 阅读 · 0 评论 -
NOIP 2013 花匠
评测传送这个题是DP? 贪心可以做的。 将相邻的相同高度的合并,搞一下波峰波谷以及ans+1-1的就可以了#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int N=100009;int n,a[N],ans;原创 2017-10-18 14:07:44 · 237 阅读 · 0 评论 -
互不侵犯King
https://www.luogu.org/problem/show?pid=1896 这是一道状压dp题。It`s the first time that I had accepted a zhuangya dp problem! 把一行每一位放与不放用二进制中的01表示,状态压缩就是将一行的状态用一个二进制数表示。 解法在代码的注释中:#include<iostream>#include原创 2017-08-08 11:29:14 · 414 阅读 · 0 评论 -
圆桌游戏
【问题描述】 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号。对1< i< n的i来说,i号的左边是i+1号,右边是i-1号。1号的右边是n号,n号的左边是1号。每一轮游戏时,主持人指定一个还坐在桌边的人(假设是i号),让他向坐在他左边的人(假设是j号)发起挑战,如果挑战成功,那么j离开圆桌,如果挑战失败,那么i离开圆桌。当圆桌边只剩下一个人时,这个人原创 2017-09-13 17:48:41 · 3355 阅读 · 0 评论 -
P1052 过河(状压dp)
https://www.luogu.org/problem/show?pid=1052 观察数据,L到10^9,就是O(n)也不可以。 然后再观察数据,发现共才100个石子,对于桥的长度来说石子非常稀疏,中间有一大块空白区域。 状态转移方程: f[i]=min(f[i],f[i-j]+v[i]); 发现,f[i]的状态只跟f[i-t]~f[i-s]有关,所以中间会有一大块区域无用(可以这原创 2017-06-07 08:52:16 · 468 阅读 · 0 评论 -
1091 合唱队形(最长上升子序列模板)
https://www.luogu.org/problem/show?pid=1091#sub问题转化为:枚举中间点,以此为终点求最长的上升子序列,以此为起点求最长下降子序列。#include<iostream>#include<cstdio>using namespace std;int q[110],fq[110],fh[110],n,ans=500;int main(){ i原创 2017-06-02 15:35:11 · 312 阅读 · 0 评论 -
P1387 最大正方形
https://www.luogu.org/problem/show?pid=1387法1:矩阵前缀和(n^3) 枚举点i,j 和边长o,如果右下角与左下角之间的数是完全平方数,既是正方形。#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<queue>#i原创 2017-06-06 11:37:45 · 594 阅读 · 2 评论 -
P1006 传纸条(dp)
和方格取数类似,可以看做同时从左上角出发,同时走,步数是同步的。 可以用四维数组,也可以用三维数组。 从左上角到右下角,步数是两点的曼哈顿距离。 得到状态转移方程 :int h=max(max(f[k-1][i][j],f[k-1][i-1][j]),max(max(f[k-1][i][j-1],f[k-1][i-1][j-1]),f[k][i][j])); f原创 2017-06-06 15:04:19 · 441 阅读 · 0 评论 -
P1004 方格取数
https://www.luogu.org/problem/show?pid=1004#sub 四维做法基于可以看做俩个人,同时走。 从左上角到右下角步数是一定的,所以可以压缩到三维。#include<iostream>#include<algorithm>#include<cstdio>using namespace std;int f[20][20][20],a0[20][20]原创 2017-06-06 15:13:50 · 393 阅读 · 0 评论 -
P1020 导弹拦截(弱数据)
https://www.luogu.org/problem/show?pid=1020 法一,dp 第一问要求一个以第一个为起点最长不上升子序列。 第二问,只要后面的比前一个高,就要再另用一套系统,所以问题可以转化为求最长的上升子序列。#include<iostream>#include<cstdio>#define LL long long#define M 30010原创 2017-06-05 15:30:14 · 304 阅读 · 0 评论 -
P1156 垃圾陷阱(dp)有待理解
题见洛谷#include<iostream>#include<cstdio>#include<cstring>#include<string> #include<algorithm>using namespace std;int deep,n,maxl=0,anst=999999;struct H{ int tim,tall,last;}st[200];int f[200]原创 2017-02-09 09:46:10 · 370 阅读 · 0 评论 -
P1063 能量项链(区间dp)
题见洛谷#include<iostream>#include<cstdio>#include<cstring>#include<string> #include<algorithm>using namespace std;long long ans=0;int a[300],n,f[300][300];int main(){ scanf("%d",&n); for(原创 2017-02-08 16:35:36 · 332 阅读 · 0 评论 -
P1064 金明的预算方案
题见洛谷由于依赖少 , 可以改为分组背包 #include<iostream>#include<cstdio>#include<cstring>#include<string> #include<algorithm>using namespace std;int v[210],c[210],n,m,wj[210][3],wpv[210],wpc[210]; int f[32000+1原创 2017-02-08 15:03:57 · 580 阅读 · 0 评论 -
P1541 乌龟棋
题见洛谷记忆化搜索#include<iostream>#include<cstdio>#include<cstring>#include<string> #include<algorithm>using namespace std;int num[5],a0[400];int dp[40][40][40][40],ans=0;int n,m;int dfs(int x,int a,原创 2017-02-08 09:44:03 · 345 阅读 · 0 评论