
DP
文章平均质量分 60
squee_spoon
这个作者很懒,什么都没留下…
展开
-
###修改标题
近日,举世瞩目的人机大战李世石九段对阵Google AlphaGo在首尔四季酒店进行。 假设人机大战将进行n盘,已知AI单局的胜率为p%,每局比赛互不影响,AI不会在比完全部n局比赛前增强。人工智能爱好者squee_spoon支持AI获胜,他与朋友打赌AI至少会获得k盘的胜利,如果AI获胜盘数大于等于k,squee_spoon将获得a元,否则他将失去a元。但是,在每一盘比完之后(最后一盘除外原创 2016-03-14 12:44:50 · 585 阅读 · 0 评论 -
Codeforces Round #267 (Div. 2) D
D. Fedor and Essay 题意:一篇文章由m个单词组成,你需要重写这篇文章。有n组同义词(x,y),x能用y代替,反过来不行。重写文章使得文章中含有最少的'r',且总字符数尽量少。 思路:先把所有大写字母转换成小写,然后用map把每个不同的单词转化成一个整型,建图,再用tarjan强连通缩点(因为可能有环)。。然后在缩点后的新图中dfs求解(原创 2015-01-11 23:03:08 · 676 阅读 · 0 评论 -
Codeforces Round #282 (Div. 1) B
B. Obsessive String 题意:给两个字符串s和t。你需要在s里面取出一些不互相重叠的子串,使得每一个子串都包含t,问有多少种取法。 思路:字符串hash+dp。hash是为了高效比较s的子串和t是否相等。设s长度为n,递推计算s1~si的结果,i=1...n。不好用语言描述,见代码。。。#include #include原创 2014-12-23 18:42:59 · 564 阅读 · 0 评论 -
poj1722 SUBTRACT
题意:一列数共n个,每次选择一个i,在第i和i+1个数之间添加减号,然后用差代替这两个数。最后使得n个数合成一个数T。求减号添加的位置顺序。 思路:dp(背包)。背包记录路径,就可以得到这个序列每个位置添加的是加号还是减号。然后怎么得到减号添加的顺序呢,按顺序扫描这个序列的符号,如果是加减相间的(第一个符号必须是‘-’,如“-+-+-+”),就继续往下扫,如果发现连续两个同号或者原创 2014-12-27 15:02:16 · 632 阅读 · 0 评论 -
Codeforces Round #286 (Div. 1) A
A. Mr. Kitayuta, the Treasure Hunter 题意:30001个点,下标为0~30000,有些点有宝藏。你从0往下标大的方向跳,第一步跳的距离为d。如果上一步跳的距离为l,这一步就可以跳l-1或l或l+1(距离必须大于0)。问最多拿到多少宝藏。 思路:dp。dp(i,j)表示当前位置i,上一步距离j能拿到的最大宝藏。但是j原创 2015-01-19 11:47:35 · 681 阅读 · 0 评论 -
hdu 5155 Harry And Magic Box
题意:一个n*m的网格,每行每列都有珠宝。问有多少种不同的珠宝摆放方式能满足要求。 思路:dp。dp(i,j)表示n=i,m=j时的答案。因为n和m等价,可以设i>=j。显然,当j=1时,dp(i,j)=1,然后根据dp(i,j)可以推出dp(i,j+1)。比如你现在要计算dp(i,j),并且珠宝的放置时一列一列放的,你现在已经放好了前j-1列,需要摆放最后一列,前面的每一列肯定原创 2015-01-03 22:42:14 · 633 阅读 · 0 评论 -
Codeforces Round #284 (Div. 1) B
B. Name That Tune 题意:在T秒时间内按顺序听n首歌,辨认歌名。每一秒有一次辨认的机会,如果第i首歌上一秒没认出来,这一秒认出来的概率为pi。对于第i首歌,连续听ti秒时一定能认出来。求T秒总共辨认出歌名数的期望。 思路:概率dp。dp(i,j)表示已经辨认出i首歌,且第i首在第j秒辨认出来。朴素的状态转移需要O(n*T)会超时。。所以我原创 2015-01-02 14:23:00 · 628 阅读 · 0 评论 -
自己出的题 squee_spoon and his Cube III
首先说下题意。就是一个比赛(安排得很紧凑),最多3个人同时比,每个人需要的时间是已知的,问最少总共花多少时间。或者可以想象成这样:三张桌子,一个选手比完下一个上。 问题就可以转化为:有一些数,分为三组,需要使得和最大的那组尽可能小。 这个问题可以通过dp(动态规划)来解决。dp(i,j)的第一维表示第一组的总时间,第二维表示第二组的总时间,第三组的总时间自然就是原创 2015-04-12 21:29:24 · 539 阅读 · 0 评论 -
FZU 2129 子序列个数
给一个序列,里面可能有相同元素,问能组成多少不同子序列。 DP。一直想用dp(i)表示到序列a1~ai的答案,一直想不出来,其实有更好的做法。我们可以用dp(i)表示最后一个元素为ai的子序列有多少,sum(i)表示dp(1)~dp(i)的和。状态转移见代码。#include #include #include #include using namespace st原创 2015-05-02 10:52:56 · 440 阅读 · 0 评论 -
hdu 5119 Happy Matt Friends
题意:n个数,可以取其中一部分来异或,问全部异或结果不小于m有多少种取法。 思路:dp(背包)。dp(i,j)表示取到第i个数,异或结果为j,有多少种方法。初态是有一种取法取得0,然后对每个数,有两种选择,取或不取,加上上一步的路径数就可以了。最后将dp(n,j)中j>=m的部分求和就行。需要注意的是,会爆int。#include#include#include原创 2014-11-29 18:44:44 · 1113 阅读 · 0 评论 -
Codeforces Round #279 (Div. 2) F
F. Treeland Tour原创 2014-11-24 11:21:19 · 630 阅读 · 0 评论 -
zoj 3822 (2014 牡丹江区域赛 D) Domination
题意:w原创 2014-10-14 16:49:49 · 564 阅读 · 0 评论 -
hdu 5092 Seam Carving
题意:原创 2014-11-02 21:31:02 · 658 阅读 · 0 评论 -
hdu 5000 Clone
题意:原创 2014-11-20 10:45:17 · 475 阅读 · 0 评论 -
hdu 1059 Dividing
题意:有一些价值为原创 2014-11-03 21:39:21 · 431 阅读 · 0 评论 -
hdu 4800 Josephina and RPG
题意:原创 2014-11-21 09:43:25 · 555 阅读 · 0 评论 -
hdu 4472 Count
题意:n个节点的树,处于同一层的节点大小必须一样,问共有多少种不同的形态。 思路:dp。dp(i)表示i个节点的树的答案。因为同层节点大小必须一样在求dp(i)时,除去根,还有i-1个节点,然后枚举1~i-1中能整除i-1的数,加上即可。#include#include#include#include#include#include#include#in原创 2014-11-26 23:26:55 · 519 阅读 · 0 评论 -
hdu 5009 Paint Pearls
题意:原创 2014-11-22 16:30:45 · 634 阅读 · 0 评论 -
hdu 4815 Little Tiger vs. Deep Monkey
题意:n到判断题原创 2014-10-20 21:24:19 · 665 阅读 · 0 评论 -
hdu 1398 Square Coins
硬币的面值是1*1=1,2*2=4,...,17*17=289。问1~300的金额有多少种组成方法。 类似完全背包,dp搞一下就可以了。这题也是母函数的模版题,刚刚学习了母函数,感觉异曲同工。 如果用母函数的话,相当于求这个式子(1+x+x^2+...)*(1+x^4+x^8+...)*...*(1+x^289)每项的系数。#include usi原创 2015-06-20 13:08:41 · 392 阅读 · 0 评论 -
hdu 5282 Senior's String
两个串x和y,它们的LCS长度为l,问x所有长度为l的子串中,有多少个y的子串(包括空串)。 dp。首先是求LCS,经典dp问题。然后再进行一次dp,ans(i,j)表示x前i个字符和y前j个字符的答案。状态转移是这样的,对于x的第i个字符,考虑取和不取两种情况。不取的情况比较简单,如果x的第i个字符对LCS没有贡献,那么就可以不取。如果要取x的第i个字符,找到y中前j个字符与之原创 2015-07-14 20:51:14 · 439 阅读 · 0 评论 -
hdoj 5681 zxa and wifi
比赛的时候撸了个dp,用线段树优化状态转移,无限T。。然后题解的O(n∗k)O(n*k)看不懂,后来终于自己想出另外一种O(n∗k+n∗log(n))O(n*k+n*log(n))的写法,感觉可能和题解是一个意思。 dp(i,j)dp(i,j)表示前ii户人家装了jj个WIFI的最优解,转移的时候外层循环用jj,即可以理解为一个一个加WIFI。如果第ii户人家的WIFI最右边可以照顾到第rir原创 2016-05-16 22:25:47 · 545 阅读 · 0 评论 -
TopCoder SRM 694
250 让把nn个数(范围0~255)分成三份,每份全异或起来,使得三份的和最大。很容易想到三维256*256*256的dp。实际上需要省去一维才行,毕竟知道了前两维,可以算出第三维。 然而比赛的时候我用的另一种写法。#include <bits/stdc++.h>using namespace std;#define ll long longstruct node{ short原创 2016-07-11 09:42:03 · 516 阅读 · 0 评论 -
Codeforces Round #363 (Div. 1) C LRU
C. LRU 按最近最少使用原则,维护nn首歌曲的缓存,缓存容量为kk,只有最近出现过的kk首歌会出现在缓存内。每首歌有一定的被选择的概率,问很长时间以后每首歌出现在缓存中的概率。 倒过来考虑,问题等价于不断按给定概率选取歌曲,直到选取了kk首为止,问每首歌被选择的概率。 用一个20位的二进制数来表示歌曲的集合,dp求每个集合可取得的概率,具体见代码。#include <bits/st原创 2016-07-26 23:57:43 · 471 阅读 · 0 评论 -
hdoj 5773 The All-purpose Zero
很不错的LIS题,做法基于普通O(nlogn)O(nlogn)的LIS算法。由于0可以变为任何数,那么只要出现一个0,就可以接在每个长度的LIS后面,使得每个长度+1的LIS的最小结尾,是原来这个长度LIS的最小结尾+1。但是如果每次出现0,就去维护整个序列是不划算的,考虑到改变的相对性,只要出现了0,我们就可以让后面的数都-1。#include <bits/stdc++.h>using names原创 2016-08-01 22:05:26 · 348 阅读 · 0 评论 -
hdoj 5765 Bonds
设AA为nn个点的非空真子集,UU为全集。枚举无序对(A,U−A)(A,U-A),如果AA和U−AU-A内的点都连通(关于连通性的判定,需要使用比较快的bfs方法),那么连接这两个集合的边是图的一个割。首先统计所有割的总数tottot,然后对于每个(A,U−A)(A,U-A)对应的割,AA内部的边和U−AU-A内部的边显然不在割中,dp计算每条边不在多少个割中即可,tottot减去它就是答案。#in原创 2016-08-02 00:10:32 · 406 阅读 · 0 评论 -
TopCoder SRM 696
给了20条边,最多会涉及到40个点。我们可以先贪心把那些肯定不会影响结果的点先染色(比如度为0的点和度为1的点,如果一条边连接的两个点度都是1,那么先只染一个,不然会有花费)。贪心过后,最多剩下20个点,这样就可以状压dp了。#include <bits/stdc++.h>using namespace std;#define ll long longint deg[55];bool vis[5原创 2016-08-18 23:43:06 · 855 阅读 · 0 评论 -
CF 793D Presents in Bankopolis
D. Presents in Bankopolis一个有向图,节点“有序”,找一条长度为k的最短路径,额外要求是当前边不能“跃过”已经经过的节点。 起点的选择范围是[1,n]然后每经过一个点,下一个能到达的点的范围就会缩小,注意到总可以用一个连续的范围表示之,记为[l,r]。那么用dp解决,状态dp[l][r][k]表示可达范围是[l,r],已经走了k步。 貌似dp写成记忆化搜索更符合我的思维,原创 2017-04-25 10:36:32 · 1081 阅读 · 0 评论 -
CF 797F Mice and Holes(单调队列优化dp)
F. Mice and Holes 先给老鼠和洞排序,然后dp解之dp[i][j]表示前i个洞进了j个老鼠的最小cost,很容易想到O(n∗n∗m)O(n*n*m)的做法。然后试了下类似多重背包的方法去优化,结果T了。。 看了下官方题解,给的方案是用单调队列优化。因为我们要从dp[i-1][j-1],dp[i-1][j-2],dp[i-1][j-3]…转移到dp[i][j],每个不同的状态转移过原创 2017-04-25 10:55:27 · 1023 阅读 · 0 评论 -
zoj 2338 The Towers of Hanoi Revisited
还是太naive了,在知道经典汉诺塔的情况下,居然很久没想出来。其实多根棍子和三根是一个原理。n个盘子,m根棍子的最优解,一定是把一部分盘子(假设为x)先移到某个中间棍子上,也就是先解决子问题(x,m),然后把剩下的n-x个盘子通过剩下的m-1根棍子用最优方案转移,即子问题(n-x,m-1),最后把中间棍子上的那x个盘子移过去,即子问题(x,m)。这样可以用dp来求解。#include <iostr原创 2016-04-19 22:18:37 · 394 阅读 · 0 评论 -
hdoj 3507 Print Article
我的第一道斜率优化dp。 首先,O(n^2)复杂度的dp是很容易想到的。现在我们需要用斜率优化把每次转移的复杂度优化到O(1)。考虑从dp(a)和dp(b)转移到dp(i),若从dp(a)转移要优,则有dp(a)+(sum(i)-sum(a))^2+M 于是可以得到这样的关系:(Y(a)-Y(b))/(X(a)-X(b)) 由a转移较优;(Y(a)-Y(b))/(X(a)-X(b))>原创 2016-05-13 20:56:33 · 423 阅读 · 0 评论 -
Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) B
B Minimization 给一个数列,任意安排顺序,让所有下标距离为k的两个元素作差,取绝对值,全部加起来,问和最小是多少。 分析一下就能知道,根据下标取模得数的不同,可以把这些数分为k组。在最优解情况下,每一组可以让里面的数单调,并且不同组之间也单调,然后就是dp了。比赛的时候想了好久没想清楚怎么dp,功力尚浅啊。。因为我总想着用元素的下标表示状态。。。其原创 2015-08-24 23:22:17 · 518 阅读 · 0 评论 -
Codeforces Round #315 (Div. 1) B
一个集合S中有n个元素,问S->S的所有二元关系中,有多少个关系满足对称,传递,但不满足自反的。 做这个题需要了解bell数。先定义一下C(n,k)表示从n个不同的元素中取k个的方案数;B(n)表示bell数,即将拥有n个元素的集合S划分为若干子集的方案数。B(0)=1,B(1)=1,B(2)=2,B(3)=5,B(4)=15... bell数满足这样的递推公式原创 2015-08-13 20:27:46 · 600 阅读 · 0 评论 -
Codeforces Round #316 (Div. 2) E
E Pig and Palindromes 一个n*m的网格,每个格子有一个字符,你需要从左上角走到右下角(只能往下或往右走),让经过的字符连起来是回文串,问有多少种方案。 dp。dp(i,j,k),表示从起点走到i行j列的格子,且对称的格子在第k行(列可以计算出来)的方案数,最后的答案是斜线对称轴的方案数的和。但是这样做会超内存,需要滚动数组压第一维变为i原创 2015-08-18 21:23:19 · 493 阅读 · 0 评论 -
TopCoder SRM667 250
这个题说的是,有n个长度为m的01串,按一定顺序填到对应的m个坑里,假设某次填坑,有k个坑之前没填过1,那么就会产生k*k的花费。问如何安排顺序使得花费最少。 dp。其实每次填坑,花费和填坑顺序没有太大关系,只需要关心之前哪些坑被填过1就行了。从另一个角度理解,其实不一定要填完n个串,只需要填上n个串出现过的所有1就可以了。那么就可以弄一个m位二进制来dp,外循环是坑的状态,内循原创 2015-09-12 21:09:13 · 541 阅读 · 0 评论 -
Codeforces Round #302 (Div. 1) C
Remembering Strings 状压dp。本弱在被提示了姿势的情况下,依然想不到状压行还是列,以及如何转移。。。实在太弱了。 看了下题解,想明白了。dp[i]表示使得集合i中的串(也就是整数i的二进制表示中为‘1’的那些位)容易记忆的最小花费。在转移时,逐渐加入新的串,为了使得新串容易记忆,有两种方式:一是修改新串的某一位,二是修改所有和新串某位相同原创 2015-11-26 15:54:04 · 350 阅读 · 0 评论 -
Facebook Hacker Cup 2016 Round 1 Boomerang Tournament
Boomerang Tournament题意可以这样理解,2k2^k个选手进行单淘汰比赛,对阵选手可以任意分组,求每个选手的最好和最坏可能名次。其中,每两个选手对阵的胜负是固定的。名次是这样定义的,比如8个人的比赛,第一轮挂的全部都是第5名,因为有4个人进入了下一轮,而没进入下一轮的4个人中又无法分出优劣。也就是说,名次只会出现1、2、3、5、9。最坏名次是很好求的,如果某个选手能虐所有人,他必然拿原创 2016-01-18 19:02:15 · 687 阅读 · 0 评论 -
Codeforces Round #333 (Div. 1) C
Kleofáš and the n-thlon 概率dp。dp求的东西是除了自己以外,其他人得到各种分数的概率,状态转移见代码。然后就可以算出其他人超过自己的概率了。根据这个概率,结合组合数,计算期望。由于精度问题,要先取对数。还要注意概率为0,1的情况。#include using namespace std;#define ll long longd原创 2015-12-04 10:39:09 · 463 阅读 · 0 评论 -
hdoj 5677 ztr loves substring
这是一场BC里的题,虽然这套题非常辣鸡,但这题对我来说还是有学习价值的。 首先是暴力跑一下,统计一下不同长度的回文串分别有多少个,然后就是跑存在性的多重背包了,二进制思想不错!#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <string>原创 2016-05-01 15:21:10 · 350 阅读 · 0 评论 -
hdu 4778 Gems Fight!
题意:A和B玩游戏,原创 2014-10-30 10:58:50 · 526 阅读 · 0 评论