
DP
文章平均质量分 67
Aerolite坠落
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #316 (Div. 2) E. Pig and Palindromes (DP)
题目地址:http://codeforces.com/contest/570/problem/E 比赛的时候急着睡觉这题没看。。。 最显然的一个DP方法是dp[i][x1][y1][x2][y2]表示以s[x1][y1]和s[x2][y2]为第i步分别与s[1][1]和s[n][m]形成的回文串的个数,但是数组大小太大。。这时候可以发现知道步数后,y1和y2可以根据x1,x2来求出来,所以可以优原创 2015-08-17 15:32:42 · 949 阅读 · 0 评论 -
HDU 3652 B-number (数位DP)
感觉挺不错的一道数位DP。通过这题感觉对数位DP又多了一层理解。用了四维DP数组.dp[cnt][pre][mods][in],cnt表示第几位。pre表示前面的数。mods表示目前的模,in表示目前是否包含13这个数字.然后进行dfs搜索就可以了。代码如下:#include #include #include #include #include #include #inc原创 2015-01-19 16:11:58 · 778 阅读 · 0 评论 -
HDU 2089 不要62 (数位DP)
简单的数位DP。代码如下:#include #include #include #include #include #include #include #include #include using namespace std;#define LL long long#define pi acos(-1.0)const int mod=100000000;cons原创 2015-01-19 10:34:57 · 659 阅读 · 0 评论 -
HDU 3555 Bomb (数位DP)
跟前面数位DP基本一样的,只不过这里是要求包含49,那么可以利用容斥,求出不包含49的,然后再用总数减去就行了。代码如下:#include #include #include #include #include #include #include #include #include using namespace std;#define LL __int64#defi原创 2015-01-19 10:55:31 · 833 阅读 · 0 评论 -
HYSBZ 1026 windy数 (数位DP)
数位DP第一发。发现数位DP与我自己YY的数位DP不太一样啊。。。sad。。数位DP是用dfs+记忆化搜索,从后面往前推。第一次写数位DP,调试了好长时间。。。代码如下:#include #include #include #include #include #include #include #include #include using namespace std原创 2015-01-19 09:25:26 · 1005 阅读 · 0 评论 -
HDU 1054 Strategic Game (树形DP)
dp[0][i]表示在i点上不放置一个士兵时的最小值,dp[1][i]表示在i点上放置一个士兵时的最小值。那么状态转移方程:dp[0][u]=sum(dp[1][v]),dp[1][v]=1+sum(min(dp[1][v],dp[0][v]);代码如下:#include #include #include #include #include #include #inclu原创 2015-01-18 13:19:04 · 955 阅读 · 0 评论 -
POJ 3744 Scout YYF I (概率DP+矩阵快速幂)
题目地址:POJ 3744一个线性概率DP递推式。dp[i]=p*dp[i-1]+(1-p)*dp[i-2]。但是i的值太大。所以可以分成n次,每一次中间过程的纯递推过程用矩阵快速幂来优化。只要想到矩阵快速幂就挺简单了。代码如下:#include #include #include #include #include #include #include #includ原创 2015-01-15 19:46:08 · 766 阅读 · 0 评论 -
HDU 1520 Anniversary party (树形DP)
树形DP的关键在于如何处理递归返回的信息。这题dp[i][0]表示不选i点时当前最高权值。dp[i][1]表示选i点时当前最高权值。状态转移方程:dp[u][[0]+=max(dp[v][0],dp[v][1]),dp[u][1]+=dp[v][0];代码如下:#include #include #include #include #include #include #incl原创 2015-01-16 20:53:34 · 649 阅读 · 0 评论 -
POJ 2151 Check the difficulty of problems (概率DP)
题目地址:POJ 2151dp[i][j][k]表示第i个人前j个题做对了k道题的概率。然后把dp数组求出来之后,再利用容斥原理求出最终概率。代码如下;#include #include #include #include #include #include #include #include #include using namespace std;#define原创 2015-01-15 16:38:13 · 784 阅读 · 0 评论 -
ZOJ 3329 One Person Game (概率DP)
题意:有三个骰子,分别有k1,k2,k3个面。每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。当分数大于n时结束。求游戏的期望步数。初始分数为0设dp[i]表示达到i分时到达目标状态的期望,pk为投掷k分的概率,p0为回到0的概率则dp[i]=∑(pk*dp[i+k])+dp[0]*p0+1;都和dp[0]有关系,而且dp[0]就是我们所求原创 2015-01-16 08:42:23 · 800 阅读 · 0 评论 -
HDU 5106 Bits Problem (数位DP)
题目地址:HDU 5106这个题要定义个dp结构体,dp[i][j].sum表示当前第i位还剩j个1的时候的和,dp[i][j].tot表示当前第i位还剩j个1的时候的符合要求的个数。不记录个数的话,当前位上的1无法跟着低位的出现而累加。代码如下:#include #include #include #include #include #include #include原创 2015-02-02 19:24:42 · 968 阅读 · 0 评论 -
HDU 3076 ssworld VS DDD (概率DP)
简单的概率DP。因为输入顺序反了,。错了N次。,,代码如下:#include #include #include #include #include #include #include #include #include using namespace std;#define LL __int64#define pi acos(-1.0)const int mo原创 2015-01-12 11:31:26 · 816 阅读 · 0 评论 -
POJ 2096 Collecting Bugs (概率DP)
题目地址:POJ 2096第一发概率DP。详情看这篇博客,讲的很清楚了。代码如下:#include #include #include #include #include #include #include #include #include using namespace std;#define LL __int64#define pi acos(-1.0)c原创 2015-01-11 20:06:19 · 817 阅读 · 0 评论 -
POJ 1185 炮兵阵地 (状压DP)
题目地址:POJ 1185这题的一个判断条件写错了。。导致错了好多遍。。sad。。这题跟3254差不多。可以发现,对于每一行放大炮的状态,只与它上面一行和上上一行的状态有关,每一行用状态压缩的表示方法,0表示不放大炮,1表示放大炮,同样的,先要满足硬件条件,即有的地方不能放大炮,然后就是每一行中不能有两个1的距离小于2(保证横着不互相攻击),这些要预先处理一下。然后就是状态表示和转移的原创 2015-01-10 14:56:41 · 874 阅读 · 0 评论 -
HDU 2196 Computer (树形DP)
两次DFS,先从下往上搜一次,记录每个点到子树的最长距离与次长距离。次长距离的目的是如果在第二次更新的时候,最长距离与该子节点的方向是同一个方向,那就不能用这个最长距离了,只能用次长距离来更新。那么第二次dfs就是来从上往下来更新状态的。代码如下:#include #include #include #include #include #include #include #i原创 2015-01-18 11:17:03 · 870 阅读 · 0 评论 -
POJ 3107 Godfather (树形DP)
题目地址:POJ 3107树形DP水题。记录下每个点的子树的最多节点数,以及所有子树的总结点数。然后遍历找就行了。代码如下:#include #include #include #include #include #include #include #include #include using namespace std;#define LL __int64#d原创 2015-01-18 12:05:35 · 831 阅读 · 0 评论 -
HDU 4628 Pieces (状压DP)
题目地址:HDU 4628 这题没想到怎么快速枚举子状态。。。看了题解才知道的。 用for(state=i;state>0;state=(state-1)&i)就可以了。 这题的具体做法是先预处理出所有的状态是不是回文串,然后就是普通的DP了。 代码如下:#include <iostream>#include <string.h>#include <math.h>#include <q原创 2015-07-25 15:49:56 · 738 阅读 · 0 评论 -
NYOJ 737 石子合并(一) (区间DP+平行四边形优化)
题目地址:NYOJ 737 定义状态dp [ i ] [ j ]为从第i个石子到第j个石子的合并最小代价。 没有优化的代码如下:耗时248ms。#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <m原创 2015-04-24 20:24:27 · 2258 阅读 · 0 评论 -
(福大2015年3月月赛)FZU 2186 小明的迷宫 (BFS+状压DP)
题目地址:FZU 2186 这题是很基础的TSP状压,各个点之间的距离要先用BFS预处理出来。 这题在写memset(dp,INF,sizeof(dp));时,写成了memset(dp,INF,sizeof(d));。。。 调试了好长时间。。无语了。。。最近的状态太不行了。。 代码如下:#include <iostream>#include <string.h>#include <mat原创 2015-03-24 17:12:13 · 1175 阅读 · 0 评论 -
HDU 4389 X mod f(x) (数位DP)
题目地址:HDU 4389 第一次遇到需要先枚举然后再数位DP的。 先枚举各位数之和,即,1~81,然后数位DP过程中再判断枚举的各位数之和与枚举的数是否相同,只有相同的才算。 dp[i][j][k][h]表示第i位上,当前的各位数和为j,枚举的各位数和为k,当前的数对k取模为h的数的个数。 代码如下:#include <iostream>#include <string.h>#incl原创 2015-04-01 20:27:26 · 756 阅读 · 0 评论 -
HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)
题目地址:HDU 1428 先用BFS+优先队列求出所有点到机房的最短距离,然后用记忆化搜索去搜。 代码如下:#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set原创 2015-03-13 11:17:11 · 840 阅读 · 0 评论 -
POJ 3666 Making the Grade (DP+离散化)
题目地址:POJ3666 dp[i][j]表示第i位时,值为j时的最小代价。因为j太大,由于要改变值的话,变到与之最近的值相同是最优的,所以可以离散化,这样,j对应了各个值得下标。复杂度O(n^2)。 代码如下:#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorith原创 2015-03-13 09:52:28 · 1263 阅读 · 0 评论 -
codeforces 500D - New Year Santa Network (树形DP+组合数学)
题目地址:http://codeforces.com/contest/500/problem/D这题是要先求出每条边出现的次数,然后除以总次数,这样期望就求出来了。先用树形DP求出每个边左右两端总共有多少个点,然后用组合数学公式就可以推出来了。代码如下:#include #include #include #include #include #include #includ原创 2015-01-22 10:59:16 · 1268 阅读 · 0 评论 -
Codeforces Round #293 (Div. 2) D. Ilya and Escalator (概率DP)
dp[i][j]表示第i秒电梯进去的人数为j时的概率。由于概率比较好求,而且这里的样本是有限个。所以可以先求出概率,然后用公式转化成期望。#include #include #include #include #include #include #include #include #include using namespace std;#define LL __int64原创 2015-02-25 22:27:44 · 832 阅读 · 0 评论 -
POJ 3252 Round Numbers (数位DP)
题目地址:POJ 3252dp[i][j]代表第i位,1比0多j个的时候的个数,因为j会出现负数,所以可以都加上40再储存。然后就是简单的数位DP了。代码如下:#include #include #include #include #include #include #include #include #include using namespace std;#de原创 2015-01-22 15:02:28 · 862 阅读 · 0 评论 -
Codeforces Round #286 (Div. 2) C题 Mr. Kitayuta, the Treasure Hunter (DFS+记忆化DP)
题目地址:http://codeforces.com/contest/505/problem/C从d点开始,每个点都有三个方向,形成了一棵树,那么就从跟结点开始进行dfs查找,dp数组记录当前的点和长度,当这两个条件相同的时候,显然,后面的子树是完全相同的,于是用记忆化来优化。代码如下:#include #include #include #include #include原创 2015-01-22 09:56:55 · 1448 阅读 · 0 评论 -
CodeForces 55D Beautiful numbers (数位DP)
想了半天,总算想出来了。这题刚上来的思路很明显是11维DP。。但是明显不可取。。 这题的关键在于只要两个数前面的拥有的数字是一样的,而且此时与其最小公倍数的模是一样的,那么这时候就可以认为对所有的数字取模都是相等的,那么后面的总情况数属于完美数的情况也是相同的。 只要想到这步的话,那么基本思路就出来了,我第一次居然脑残的记录lcm与模2520(2到9的最小公原创 2015-01-19 21:10:26 · 835 阅读 · 0 评论 -
Codeforces Round #291 (Div. 2) E - Darth Vader and Tree (DP+矩阵快速幂)
这题想了好长时间,果断没思路。。于是搜了一下题解。一看题解上的”快速幂”这俩字,不对。。这仨字。。犹如醍醐灌顶啊。。。因为x的范围是10^9,所以当时想的时候果断把dp递推这一方法抛弃了。我怎么就没想到矩阵快速幂呢。。。。。。。还是太弱了。。sad。。100*100*100*log(10^9)的复杂度刚刚好。 于是,想到了矩阵快速幂后,一切就变得简单了。就可以把距离<=x的所有距离的点数都通过原创 2015-02-16 23:11:59 · 1391 阅读 · 0 评论 -
POJ 1850 Code (数位DP)
题目地址:POJ 1850简单数位DP,只需要多处理一下0的时候。代码如下:#include #include #include #include #include #include #include #include #include using namespace std;#define LL __int64#define pi acos(-1.0)cons原创 2015-01-22 15:21:58 · 692 阅读 · 0 评论 -
POJ 3311 Hie with the Pie (状压DP)
题目地址:POJ 3311这题基本可以算是TSP问题,先用floyd预处理出来任意两个间对的最短路,注意是有向边。。。然后定义dp[i][j]表示在i状态下最后一个经过的城市为j的最短时间。然后状压即可。代码如下:#include #include #include #include #include #include #include #include #includ原创 2015-01-10 16:26:42 · 770 阅读 · 0 评论 -
HDU 2167 Pebbles (状压DP)
这个题再次犯了没有初始化的毛病,但是样例居然只有第2组不对,其他的都对。。。而且还没法调试。。。。。这个题还是很简单的状压。还是把每一行的状态都先预处理出来。然后从第一行往下不断进行状态转移。为了不TLE,应该把每种状态下的和也预处理出来。代码如下:#include #include #include #include #include #include #include原创 2015-01-10 20:34:00 · 901 阅读 · 0 评论 -
Ural 1303 Minimal Coverage(贪心)
题目地址:Ural 1303先按每个线段的左端点排序,然后设置一个起点s,每次都从起点小于等于s的线段中找到一个右端点最大的。并将该右端点作为新的起点s,然后继续找。从左到右扫描一遍即可。代码如下:#include #include #include #include #include #include #include #include #include #incl原创 2014-10-26 20:47:46 · 1075 阅读 · 0 评论 -
Ural 1635 Mnemonics and Palindromes(DP)
题目地址:Ural 1635又是输出路径的DP。。。连着做了好多个了。。状态转移还是挺简单的。要先预处理出来所有的回文串,tag[i][j]为1表示字符串i--j是一个回文串,否则不是回文串。预处理时要用n^2的方法,即枚举回文串中间,可以分奇数和偶数两种分别求一次。然后dp转移方程为,若tag[j][i]==1,dp[i]=min(dp[i],dp[j-1]+1);对于最令人讨厌原创 2014-10-23 21:02:34 · 931 阅读 · 0 评论 -
HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)
题目地址:HDU 5067经典的TSP旅行商问题模型。状压DP。先分别预处理出来每两个石子堆的距离。然后将题目转化成10个城市每个城市至少经过一次的最短时间模型。然后简单的状压DP即可。代码如下:#include #include #include #include #include #include #include #include #include #inc原创 2014-10-23 09:44:18 · 1195 阅读 · 0 评论 -
Ural 1152 False Mirrors(状压DP)
题目地址:Ural 1152初学状压DP,原来状压只是用到了个位运算。。很水的状压DP。注意四则运算的优先级是高于位运算的。。也就是说如果既用到了四则运算,也用到了位运算,要想先算位运算的话,要将位运算加括号。因为这个地方调了好久。。代码如下:#include #include #include #include #include #include #include原创 2014-10-06 15:58:29 · 932 阅读 · 0 评论 -
HDU 1559 最大子矩阵 (DP)
题目地址:HDU 1559构造二维前缀和矩阵。即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和。然后枚举每个矩阵的左上方的点,由于矩阵的长和宽是固定的,那么这个矩阵实际上也已经固定了。此时这个矩阵的和用公式:sum=a[i+x-1][j+y-1]-a[i+x-1][j-1]-a[i-1][j+y-1]+a[i-1][j-1];取最大值就可以了。原创 2014-10-06 20:54:28 · 1302 阅读 · 0 评论 -
Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
题目地址:Ural 1183终于把这题给A了。。。拖拉了好长时间,。。自己想还是想不出来,正好紫书上有这题。d[i][j]为输入序列从下标i到下标j最少需要加多少括号才能成为合法序列。0c[i][j]为输入序列从下标i到下标j的断开位置,如果没有断开则为-1。当i==j时,d[i][j]为1当s[i]=='(' && s[j]==')' 或者 s[i]=='['原创 2014-10-22 10:03:42 · 1249 阅读 · 0 评论 -
Ural 1586 Threeprime Numbers(DP)
题目地址:Ural 1586先定义一个prime三维数组来记录素数,若i*100+j*10+k为素数,则标记prime[i][j][k]为1,否则为0.这样对后面的处理很方便。然后定义一个dp三维数组,dp[n][i][j]表示当前n位的十位数字为i,个位数字为j时的素数个数,这时候状态要从prime[k][i][j]为素数时转移过来,所以状态转移方程为:if(prime[j][k][原创 2014-10-05 23:11:09 · 979 阅读 · 0 评论 -
HDU 1176 免费馅饼(DP)
题目地址:HDU 1176以时间为横轴,11个点位纵轴构造一个矩阵,然后利用数字三角形的方法从上往下递推下去。代码如下:#include #include #include #include #include #include #include #include #include #include #include using namespace std;in原创 2014-09-03 16:08:57 · 866 阅读 · 0 评论 -
HDU 1003 Max Sum(DP)
题目地址:HDU 1003DP好弱。。先补补DP的基础。。。这题就是记录起始点与终止点,然后每当发现一个更大的,就更新。从左往右扫一遍就行了。代码如下:#include #include #include #include #include #include #include #include #include #include #include using原创 2014-09-03 15:15:41 · 863 阅读 · 0 评论