
DP
文章平均质量分 63
little_胖
这个作者很懒,什么都没留下…
展开
-
HDU 1668 POJ 2288 Islands and Bridges
以下解题思路摘自:http://www.cnblogs.com/jackge/archive/2013/05/24/3096162.html取dp[state][i][j]表示state状态下倒数第二个岛为i,最后一个岛为j时的最优解,num[state][i][j]为相应的路径数目,其中state的二进制表示的i位为1表示岛i被访问过,反之为0。则显然当有边(i,j)存在时,有如下初值可原创 2013-08-08 21:24:40 · 901 阅读 · 0 评论 -
HDU 3001 Travelling
题意:给出n个点,以及每条边的边权,求从任意一点开始走完所以点且每个点最多走两次的最小花费。TSP问题,每个点有3个状态,所以用3进制压缩,以dp[i][j]来记录状态为i,且起点为j的最小花费.状态转移方程:dp[x][k] = min(dp[i][j]+Map[j][k]);其中x为在状态i的基础上加上走k点的状态。#include #include #include #in原创 2013-08-05 19:43:09 · 395 阅读 · 0 评论 -
SGU 223 Little Kings
状压DP,用dp[i][j][k]来表示第i行的状态为第j个时,前i行总共放置k个king的方案数,则dp[i][j][k] = sum(dp[i-1][y][k-num[j]]),其中y是第i-1行的状态,num[j]为第i行的j状态所放置的king的个数。#include #include #include #include #include #include #inclu原创 2013-08-05 13:16:18 · 542 阅读 · 0 评论 -
HDU 4123 Bob’s Race 树状DP+RMQ预处理
题意:给你一棵树,然后标号为1~n,每条边都有一定的边权,那么从每个点出发都有一个最远距离;先用树状DP求出每个点的最远距离,再用PMQ处理区间的最大值和最小值。注意在这里用log的话时间会浪费很多,所以需要预处理。#include #include #include #include #include #include #include #include #inclu原创 2013-07-05 12:39:36 · 475 阅读 · 0 评论 -
HDU 4616 Game
树状DP,这题我写了2个Dfs来做,第一个以任意一点(我用的0节点)作为根节点,求出以每个点作为根节点的子树上机会为1~C时各自的最大值,然后第二次Dfs用父亲节点来更新儿子节点,求出每个点作为根节点能获得的最大值,做了之后看了看别人的题解,貌似只用一个Dfs就够了,而且代码量也比较少,等会儿再去看看吧。#include #include using namespace std;con原创 2013-07-31 15:02:45 · 404 阅读 · 0 评论 -
UESTC 1689 吉利数字
数位dp加二分,类似的还有HDU 3271 SNIBB#include #include #include #include #include #include #include #include #include #include #include using namespace std;#define ll long long#define int64 __i原创 2013-07-22 21:36:04 · 1378 阅读 · 0 评论 -
HDU 3586 Information Disturbing 树状DP+二分
题意:给出一棵树,和每条边的cost值,设置一个界限,要求切断所有叶子结点,切断的边的cost不能超过界限值,并且切断的边的总和不能超过m,求出这个最小界限值。思路:二分枚举最小界限值,用树状DP求出在这个限制下的最小花费是否小于m。#include #include #include #include #include #include #include #include原创 2013-07-05 16:28:48 · 388 阅读 · 0 评论 -
UESTC 1307 windy数 数位DP
简单数位DP,用dp[index][front][fg]标记,三维分别为搜到的深度,当前深度的前一个数,前面是否全部为0,。 #include #include #include #include #include #include #include #include #include #include using namespace std;#define ll l原创 2013-07-05 22:09:19 · 640 阅读 · 0 评论 -
HDU 1655 Balancing Act
也是个简单树状DP,和POJ3107的写法基本一致。#include #include #include #include #include #include #include #include #include #include using namespace std;#define ll long long#define int64 __int64#define原创 2013-07-06 10:30:10 · 723 阅读 · 0 评论 -
HDU 1227 Fast Food
我只想说这题有点烦。用dp[i][j]来表示前j个商店建i个仓库的最小距离,则dp[i][j] = min(dp[i-1][l]+cost[l+1][j]) (1#include #include #include #include #include #include #include #include using namespace std;#define M 1005原创 2013-06-17 17:06:14 · 452 阅读 · 0 评论 -
POJ 3107 Godfather 树状DP
这题其实就是一个简单的树状DP,但是最扯的是它居然要卡STL,超时超到哭啊,只能用链表了。#include #include #include #include #include #include #include #include #include #include using namespace std;#define ll long long#define int原创 2013-07-06 10:06:07 · 484 阅读 · 0 评论 -
HDU 4276 树形DP
题意:给你n个点,n-1条边构成树,每条边有边树,每个点有点权(表示走每条边的时间),问在时间T从点1走到点n,能够得到最多的点权有多少。我的思路:3个Dfs,第一个用来标记从1到n的路径,第二个用来求每个点除必走关键路径外所能得到的最大点权,第三次则是用父亲节点更新儿子节点能获得的最大值。网上的思路:首先spfa求一次最短路,如果从1到n的最短花费都小于总时间,则是不可能。而原创 2013-07-04 20:42:45 · 473 阅读 · 0 评论 -
HDU 4340 Capturing a country ()
树状DP,最开始一点想法都没有,看了这篇博客http://blog.youkuaiyun.com/cyberzhg/article/details/7840922才领悟了一点,然后再自己敲敲代码,才弄懂了。 #include #include #include #include #include #include #include #include #include using na原创 2013-07-04 15:35:13 · 551 阅读 · 0 评论 -
POJ 3252 Round Numbers
数位DP,dp[index][zero][one]三维分别为层数,零的个数,一的个数,需要注意的是在传递零下去的时候只有在一的个数不为一的时候才能加一,不然加上去的就是前置零,是无意义的零。#include #include #include #include #include #include #include #include #include #include #in原创 2013-07-20 11:15:16 · 459 阅读 · 0 评论 -
HDU 2196 Computer
题意:给出一个图,求出与每个点能到达的最远距离思路:以每个点和他直接相连的点作为一个方向,每次往下深搜找最大值时,先看这个方向是否之前计算过,若计算过则不用重复计算了。具体看代码里面的注释#include #include #include #include #include #include #include #include using namespace std;原创 2013-06-26 10:19:05 · 405 阅读 · 0 评论 -
POJ 1185 炮兵阵地
状压DP,dp[i][j][k]记录第i行为状态j,且第i-1行为状态k时的最大值。注意第一二行单独更新就行了。#include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef __i原创 2013-08-05 20:13:08 · 394 阅读 · 0 评论 -
HDU 4604 Deque
题意:给你一个序列,要求你将它从左到右放入一个双向队列中,可以选择放入队尾,队首,或者不放入,求这个队列中最多能放多少个数。思路:这个队列要最长则必然是以某一点开始的此点右边的最长不上升和最长不下降序列的和再减去重叠的部分。所以可以先求出每个点右边的最长不上升和最长不下降序列的长度以及每个序列中的重叠部分。再枚举每个点,求出答案。#include #include #include原创 2013-08-05 21:45:24 · 504 阅读 · 0 评论 -
UESTC 1685 我要长高
借鉴:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html首先建立方程,很容易想到的是,dp[i][j]表示第 i 个儿子身高为 j 的最低花费。分析题目很容易知道,当前儿子的身高花费只由前一个儿子影响。因此,dp[i][j]=min(dp[i-1][k] + abs(j-k)*C + (x[i]-j)*(x[i]-原创 2013-08-06 18:58:51 · 799 阅读 · 0 评论 -
HDU 3886 Final Kichiku “Lanlanshu” 数位DP
思路:以dp[index][fg][pre][pos]来标记, 4维分别为搜到的深度,前面是否出现过非0位,前一位数pre,前一位数满足的条件。若当前搜到的层数取 i ,则判断 i 的值和pre是满足str[pos]还是满足str[pos-1]的,来判断当前层应假设满足的条件。#include #include #include #include #include #include原创 2013-08-31 16:10:55 · 705 阅读 · 0 评论 -
POJ 3017 Cut the Sequence 单调队列+平衡树
题意:给出一个序列,求将序列划分成若干段,且每段和不超过m的情况下,每段的最大值的和最小为多少。思路:比较朴素的想法还是比较好想的,即:dp[i] = min{ dp[j]+max{ num[k] } };其中lef[i] 所以需要优化,先用一个最大值单调队列来维护lef[i]到 i 的最大值,则dp[i] = min(dp[j] + q[head]);若num[i]为最大值,则dp[i]原创 2013-08-19 10:25:21 · 513 阅读 · 0 评论 -
CodeForces 258B Little Elephant and Elections 数位DP
题意:有7个人要从m个数里面任选一个,且不能重复,一个数里面幸运数的个数就是4的个数加7的个数,求第一个人的这个数的幸运数的个数比其他六个人的幸运数之和还要大的方案数。思路:先用数位DP求出幸运数长度为0~len的数分别有多少个,然后枚举第一个人的幸运数个数k,用一个深搜来求其他六个幸运数个数小于k的情况数。具体实现看代码:#include #include #include #in原创 2013-08-30 12:48:39 · 684 阅读 · 0 评论 -
CodeForces 215E Periodical Numbers 数位DP
题意:给你一个区间[l,r],求这个区间内满足条件的数,条件是:这个数的二进制表示时,dig[i] = dig[i+k] , (0思路:考虑[0,x]这个区间,若x的位数为len,当数的长度 i 为0~len-1时,则是无限制的,这时dp[i] = sum{2^(k-1)},k为满足条件的循环长度。而且还要去掉重复的,比如当长度为6时,循环长度为2,3的数均会重复计算,当数的长度为len时,则原创 2013-08-29 19:04:10 · 750 阅读 · 0 评论 -
HDU 3507 Print Article 斜率优化DP
题意:给出一篇文章打印每个字的花费,打印每行的花费为这一行每个字花费和的平方加m,求出将这篇文章打印到纸上的最低花费。思路:如果是朴素的dp还是比较好想的,dp[i] = dp[i]= min{ dp[j]+(sum[i]-sum[j])^2 +M } 0原创 2013-08-29 15:39:51 · 511 阅读 · 0 评论 -
HDU 4352 XHXJ's LIS
数位DP,以dp[index][sta][k]来记录搜索到当前层时,最长序列的状态为sta,要求的是长度为k的序列的个数。状态sta中1的个数即是当前这个数的最长上子升序列的长度,这个状态的求法和nlogn求最长上升子序列的求法是一样的。#include #include #include #include #include #include #include #includ原创 2013-08-13 09:49:11 · 408 阅读 · 0 评论 -
HDU 2993 MAX Average Problem
斜率优化DP。这题是论文《浅谈数形结合思想在信息学竞赛中的应用》http://wenku.baidu.com/view/b97cd22d0066f5335a8121a3.html中的例二,具体解题思路可以去论文中看看,说说这题坑的地方,输出时如果用getchar()自己写输入的话要快大概500ms左右,存数的时候要用double,如果用int的话,就算算答案的时候乘以1.0再算也是wron原创 2013-08-11 14:40:43 · 460 阅读 · 0 评论 -
HDU 1506 Largest Rectangle in a Histogram
思路:对于每一块木板,Area=height[i]*(j-k+1) 其中,j=height[i];找j,k成为关键,一般方法肯定超时,利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去…#include #include #include __int64 n , l[100005] , num[100005] , r[1原创 2013-08-09 21:37:56 · 504 阅读 · 0 评论 -
UVA 11008 Antimatter Ray Clearcutting
状态DP,以dp[i]记录砍掉的树的状态为i时的最少发射激光数,对于每个状态考虑将当前状态下未被砍的树中选一颗来砍,则考虑两种情况,一个是这颗树需要单独一束激光来砍,另一个就是这棵树和其他已经被砍的某一颗树形成一条线,而在这条线上的点都可以被砍掉,所以求砍这个方向的前一个状态时需要将在这条线上的点都减掉。具体说明看代码:#include #include #include #incl原创 2013-08-08 16:08:38 · 481 阅读 · 0 评论 -
HDU 3401 Trade
题意:给出t天内每天股票的买入价格,卖出价格,最多购买数和最多卖出数,求t天后最多能赚多少、思路:用dp[i][j]表示第i天时手里还剩j支股票的最大获利。第i天买入时:dp[i][j] = max{dpi-1][k]-(j-k)*api};即dp[i][j] = max{dp[i-1][k]+k*api}-j*api,(0第i天卖出时:dp[i][j] = max{dpi-1][k]原创 2013-08-08 10:44:51 · 435 阅读 · 0 评论 -
POJ 2441 Arrange the Bulls
题意:给你n头牛以及m个房间,每头牛只可放在一些固定的房间,求每头牛都放置到房间中的方案数。思路:用dp[i][j]表示第i头牛在状态j时的方案数,则,dp[i][j] += dp[i-1][k];其中k为前i-1头牛放置成状态k的方案数,要保证在放第i头牛的位置为0。这样写空间消耗太大,故需要改成滚动数组。dp[cnt][x] += dp[1-cnt][k];x为第i头牛可以放到房间的状原创 2013-08-07 16:09:54 · 606 阅读 · 0 评论 -
HDU 4628 Pieces
状态DP,以dp[i]表示删减为状态i时所需要的最小次数,dp[i] = min(dp[i],dp[j]+1);其中保证j-i是回文,因为要保证j状态包含i状态,所以第二重循环式j = (j+1)|i。#include #include #include #include #include #include #include #include #include #includ原创 2013-08-07 12:57:02 · 465 阅读 · 0 评论 -
ZOJ 3494 BCD Code 数位DP+AC自动机
其实还是比较裸的数位DP,只不过需要用AC自动机来预先处理一下,写了3个小时,各种调试,蛋碎了一地啊。不过幸好最后还是做出来了。思路:先用AC自动机预处理字符串,数位DP时以dp[index][pos][fg]来表示状态,分别为层数,判断到AC自动机的位置,以及是否前面出现过非0位。代码略搓:#include #include #include #include #includ原创 2013-08-19 19:41:45 · 566 阅读 · 0 评论 -
POJ 3311 Hie with the Pie
状压DP,先用flyd预处理求出每两点之间的最小花费,再以dp[i][j]表示状态为i时且终点为j的最小花费,则:dp[x][k] = min(dp[x][k],dp[i][j]+Map[j][k]);x为从状态i的终点j走到k点的状态。#include #include #include #include #include #include #include #include原创 2013-08-06 15:59:22 · 455 阅读 · 0 评论 -
LightOJ 1205 Palindromic Numbers
题意:统计在i和j之间的回文数字的个数。思路:数位DP,一个数的长度一旦确定之后,则中心也就确定了,所以在搜索的时候只要出现了非零位,数字的长度也就确定了,则在中心左边的数字可以塞限制范围内任意取,而对于中心右边的数字来说就只需要判断在限制范围内能否取得与之对称的位置的数字就行了,三维标记,dp[index][len][fg],三维分别为搜到的深度,正在搜索的回文数字的长度,和前面是否出现过非原创 2013-07-17 16:54:13 · 807 阅读 · 0 评论 -
HDU 3271 SNIBB 数位DP+二分
比较裸的数位DP,需要注意的就是二分时一定要写成 mid=((long long)l+(long long)r)>>1;不然会溢出导致超时的,被这个坑了好一会儿。#include #include #include #include #include #include #include #include #include #include #include using n原创 2013-07-16 15:29:24 · 536 阅读 · 0 评论 -
HDU 1501
http://acm.hdu.edu.cn/showproblem.php?pid=1501简单搜索。只需记录当前状态是否到过就行了。#include #include #include #include #include #include #include #include using namespace std;#define M 1000005#define ll原创 2013-06-12 11:20:26 · 402 阅读 · 0 评论 -
HDU 1074
http://acm.hdu.edu.cn/showproblem.php?pid=1074题意:给出n个课程作业需要花费的时间,以及截至日前,没超出一天就扣一分,求扣的最小分数和完成作业的顺序。思路:这题其实就是将n个作业全排列,找出扣分最小的那个排列并输出,不过要注意状态重复的勤快,比如之前完成作业的顺序的前一部分是1,2,3,现在排列前一部分的结果是3 ,2 , 1,那么如果之前这种原创 2013-06-12 10:52:25 · 473 阅读 · 0 评论 -
HDU 1502
http://acm.hdu.edu.cn/showproblem.php?pid=1502题意:给你n个A,n个B,n个C,求出满足条件if c is a prefix of w , then A(c)>= B(c) >= C(c) .的排列的个数。题一看完就想到了记忆化搜索,觉得挺简单的,就直接开始写了,等写完了才发现,答案实在是太大了。必须要用大整数的加法才行,然后又改成了大整数原创 2013-06-12 16:25:36 · 717 阅读 · 0 评论 -
HDU 1158
http://acm.hdu.edu.cn/showproblem.php?pid=1158用记忆化搜索做的,dp[index][sum]表示第index个月有sum个工人的情况下,以后几个月所用的最小花费,比较简单,直接看代码吧。#include #include #include #include #include #include #include #include原创 2013-06-11 16:29:20 · 469 阅读 · 0 评论 -
HDU 1422
http://acm.hdu.edu.cn/showproblem.php?pid=1422题意:给出n个城市的生活费及花费,可以从任意一个城市出发按顺序沿后面的城市逐个旅游,当生活费低于必要的花费时则停止,求最多能旅游的城市的个数。思路:从第一个城市开始,用W和L分别表示旅游到某个点时的生活费及花费,如果W>=L则可以继续旅游,否则以下一个点为起点从新开始旅游,答案为出现过的最大值。原创 2013-06-11 11:12:35 · 431 阅读 · 0 评论 -
HDU 1024
http://acm.hdu.edu.cn/showproblem.php?pid=1024这题可以这样来想:以dp[i][j]来表示前i个数字构成j段的最大和,则dp[i][j] = max(dp[i-1][j],max(dp[t][j-1])),其中0但是这样写空间复杂度和时间复杂度都太高了。继续往下想:如果第i个数字加入前一段的话,就只与前一个数字的状态有关,则可以用一维的动态数组来原创 2013-05-29 10:40:20 · 569 阅读 · 0 评论