动态规划
文章平均质量分 72
iHge2k
专注数据结构和算法
展开
-
hdu 4784 Dinner Coming Soon(spfa + 优先队列)
Dinner Coming Soon原创 2014-10-05 20:41:35 · 391 阅读 · 0 评论 -
hdu 3905(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3905思路:dp[i][j]表示前i分钟,睡了j分钟收获的的最大价值,并记tmp_dp[i][j]为从i开始前的连续L分钟都是醒着的,并且睡了j分钟所能得到的最大价值,于是状态转移方程可以表示为:第 i 分钟睡dp[i][j]=dp[i-1][j-1];第 i 分钟醒着 dp[i][j]=m原创 2014-05-26 18:06:13 · 357 阅读 · 0 评论 -
loj 1017(dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25843思路:我们可以发现题目与点的X坐标没有关系,于是可以直接对y坐标进行排序,然后进行dp,dp[i][j]表示以j个区间覆盖前i个点的最大覆盖数。 1 #include 2 #include 3 #include 4 #include原创 2014-05-26 18:08:24 · 398 阅读 · 0 评论 -
poj上的dp专题
更新中...http://poj.org/problem?id=1037dp[i][j][0]表示序列长度为i,以j开始并且前两位下降的合法序列数目;dp[i][j][1]表示序列长度为i, 以j开始并且前两位上升的合法序列数目;于是我们可以得到递推方程式:dp[i][j][0] += dp[i-1][k][1] ( 1 http://paste.ubuntu.com/6941原创 2014-05-26 18:09:48 · 605 阅读 · 2 评论 -
dp
题目链接:http://acm.upc.edu.cn/problem.php?cid=1028&pid=3刚刚做的比赛的一道dp题,感觉不错,就拿出来分享一下:思路://dp[i][j][k]表示前i个字符算出的值是j并且最后一位为k(0/1)的数的个数//dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];//dp[i][j][1]=dp[i-1][j-1原创 2014-05-26 17:59:28 · 357 阅读 · 0 评论 -
hdu 3339(01背包+最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3339大致题意是说:有n个电站,每个电站都有一定的电量,电站之间有一定距离,我们要从0点出发去占领一些电站,使得占领的电站电量之和超过总电量的一半,求达到条件所要走的最短距离。如果可能的话,输出距离,否则输出不可能。思路:我们从0点开始派出一些tank去占领一些电站,坦克到每个电站都有一定距离,原创 2014-05-26 17:52:16 · 497 阅读 · 0 评论 -
hdu 3555(位dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555题目大意是让你求出[1,n]中多少个数包含49;1.dp[len][0] 代表数字长度为len不含49的个数 2.dp[len][1] 代表数字长度为len不含49但是以9开头的个数(显然dp[len][1]包含在dp[len][0]中)3.dp[len][2] 代表数字长度为le原创 2014-05-26 17:52:23 · 372 阅读 · 0 评论 -
hdu 4501(背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4501思路:dp[l][i][j][p]表示选前l件时花费i元,积分j,免费p时最大价值View Code 1 #include 2 #include 3 #include 4 const int N=104; 5 using namespace std; 6原创 2014-05-26 17:53:41 · 392 阅读 · 0 评论 -
hdu 1712(分组背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712思路:这是一道简单的分组背包,因为每种课可以有多种选择:花几天时间在该课上。一旦作出选择,就不能再选该课,就相当于有多组物品,每组内的物品互相冲突,最多只能选一件。伪码:for 所有的组k for v=V..0 for 所有的i属于组k原创 2014-05-26 17:55:14 · 305 阅读 · 0 评论 -
hdu 3899(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3899思路:num[u]表示u以及u的子树的队伍数的总和,dist[u]表示u到根节点的距离,dp[u]表示以u为根时的总花费。我们可以先做一次dfs算出树上所有点到根节点(1)的花费总和,然后同时计算出num[],然后就是又一次dfs算出以每个点为根的话费,这里有dp[v]=dp[u]+(sum-原创 2014-05-26 18:06:18 · 405 阅读 · 0 评论 -
hdu 1561(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561思路:dp[u][i]表示以u为根的树选了i个子节点。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 222 8原创 2014-05-26 18:06:26 · 326 阅读 · 0 评论 -
ural 1018(树形dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662思路:典型的树形dp,处理的时候类似于分组背包,dp[i][j]代表以i为根的树取j个分支获得的最大值。 1 #include 2 #include 3 #include 4 #include 5 #include 6 us原创 2014-05-26 18:07:59 · 455 阅读 · 0 评论 -
loj 1030概率dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1030思路:一直以来对这种概率题都挺感冒的=.=......还是说一下思路吧,dp[i]表示前i个位置所能能到的期望值,然后我们可以从后往前递推。 1 #include 2 #include 3 #include 4 #include 5 #inc原创 2014-05-26 18:09:31 · 429 阅读 · 0 评论 -
hdu 2602(01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602题目很简单,值得一提的是:如果要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。为什么呢?可以这样理解原创 2014-05-26 17:52:33 · 341 阅读 · 0 评论 -
hdu 1231(最大连续子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231dp水题;View Code 1 #include 2 #include 3 const int N=11000; 4 using namespace std; 5 int a[N],dp[N]; 6 7 int main(){ 8 int原创 2014-05-26 17:52:27 · 322 阅读 · 0 评论 -
hdu 1257(最长递增子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257思路:其实,仔细一想,该序列的最长递增子序列即为至少要多少套导弹拦截系统;dp[i]表示拦截第i个导弹时的最长递增子序列的长度;View Code 1 #include 2 #include 3 const int N=1010; 4 using namespac原创 2014-05-26 17:52:52 · 369 阅读 · 0 评论 -
hdu 3998(最长上升子序列及个数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998思路:可以用n*log(n)的做法求出最长上升子序列,然后删除原数组中的这些数,再求最长上升子序列(如果长度减小,则直接退出)。View Code 1 #include 2 #include 3 #include 4 #include 5 #include 6原创 2014-05-26 17:57:45 · 369 阅读 · 0 评论 -
hdu 1503(最长公共子序列的升级版)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503思路:如何求最长公共子序列就不说了,另外如果有str2[j]==str1[i],那就mark[i]=j,相当于一个标记。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #原创 2014-05-26 17:59:41 · 320 阅读 · 0 评论 -
poj 3249(bfs+dp或者记忆化搜索)
题目链接:http://poj.org/problem?id=3249思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4000ms险过。之后有写了个dfs记忆化搜索,果然快多了。bfs AC code: 1 #include 2 #include 3 #include 4 #inclu原创 2014-05-26 18:04:55 · 326 阅读 · 0 评论 -
hdu 4576(概率dp+滚动数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576思路:由于每次从某一位置到达另一位置的概率为0.5,因此我们用dp[i][j]表示第i次操作落在位置j的概率,并且可以发现,当前位置的概率只与上一次的位置上的概率有关,因此我们可以滚动数组来处理。最后就是从l到r的概率累加了。http://paste.ubuntu.com/5998274/原创 2014-05-26 18:04:11 · 447 阅读 · 0 评论 -
hdu 4568 Hunter(spfa预处理 + 状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568思路:原创 2014-10-06 12:36:46 · 440 阅读 · 0 评论 -
Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B思路: dp[now][0]原创 2014-05-29 17:01:49 · 745 阅读 · 0 评论 -
hdu 4826(dp + 记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826思路:dp原创 2014-05-27 22:17:58 · 490 阅读 · 0 评论 -
hdu 2189
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2189思路:dp[i][j]表示用最大不超过i的素数组成整数j的最多的方法。1、若i不是素数,则dp[i][j]=dp[i-1][j];2、否则,dp[i][j]=d[i-1][j]+dp[i][j-i];View Code 1 #include 2 #include原创 2014-05-26 17:54:04 · 305 阅读 · 0 评论 -
hdu 1864(01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864大意:对于每张发票,要么报销,要么不报销,0-1背包,张数即为背包;转移方程:f[j]=max(f[j],f[j-1]+v[i]);一开始边界没考虑,导致输出结果为0.00;View Code 1 #include 2 #include 3 #include 4原创 2014-05-26 17:52:25 · 285 阅读 · 0 评论 -
bnu 4359(数位dp)
题目链接:http://gnu.bnu.edu.cn/contest/problem_show.php?pid=4359思路:直接递推就可以了,dp[i][0]表示前i位不含4或者13,且最后一位不为1的个数,dp[i][1]表示前i位不含4或者13,最后一位为1的个数;于是有dp[i][0]=8*dp[i-1][0]+7*dp[i-1][1],dp[i][1]=dp[i-1][0]+dp[i原创 2014-05-26 18:00:14 · 336 阅读 · 0 评论 -
hdu 4705(树形DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数。于是我们可以确定中间点B,在当前以B为根求得的son中任选一个,在剩下的节点n-tmp-1(tmp为已经求得的B的儿子的个数)中任选一个,产生tmp*(n-tmp-1)中组合。 1 #include 2 #in原创 2014-05-26 18:04:21 · 679 阅读 · 0 评论 -
hdu 4003(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003思路:dp[i][j]表示以i为根选择j个机器人的最小花费,然后就是背包了:dp[u][i]=min(dp[u][i],dp[u][i-j]+dp[v][j]+j*w)(1 1 #include 2 #include 3 #include 4 #include 5原创 2014-05-26 18:06:20 · 312 阅读 · 0 评论 -
poj 1463(树形dp)
题目链接:http://poj.org/problem?id=1463思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #de原创 2014-05-26 18:08:15 · 327 阅读 · 0 评论 -
hdu 1513(dp+滚动数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513思路:n这么大,可以采用滚动数组,然后就是求原串和反串的LCS了。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 7 int dp[2][5555]; 8 ch原创 2014-05-26 18:06:30 · 309 阅读 · 0 评论 -
hdu 1159(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159思路:dp[i][j]表示s1从0~i-1,s2从0~j-1的最长公共子序列;递推方程为:dp[i][j]=(s1[i-1]==s2[j-1])?d[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);View Code 1 #include 2原创 2014-05-26 17:52:50 · 325 阅读 · 0 评论 -
hdu 1559(最大子矩阵)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1559思路:感觉就是1081这题差不多,但就是加了一个限制条件。。。View Code 1 #include 2 #include 3 const int N=1010; 4 using namespace std; 5 6 int map[N][N]; 7原创 2014-05-26 17:53:16 · 308 阅读 · 0 评论 -
hdu 1081(最大子矩阵)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081思路:其实就是化二维为一维,可以把有相同行数的每一列的最大值求出来就可以了,每次都更新就行了。。。View Code 1 #include 2 const int N=110; 3 const int inf=1000000000; 4 using namespace原创 2014-05-26 17:53:13 · 330 阅读 · 0 评论 -
hdu 1025(最长非递减子序列的n*log(n)求法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025经典题。。。最长非递减序列的n*log(n)求法。。。orz...View Code 1 #include 2 const int N=500007; 3 using namespace std; 4 int city[N]; 5 int dp[N];//dp[i原创 2014-05-26 17:54:25 · 923 阅读 · 0 评论 -
hdu 1423(最长公共递增子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1423思路:dp[i][j]表示序列1(1-i)和序列2(1-j)最长的公共子序列View Code 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int MAX原创 2014-05-26 17:56:48 · 375 阅读 · 0 评论 -
hdu 1514(记忆化+位压缩+dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514思路:orz...大牛讲的太妙了:题意是给4堆(堆的高度小于等于40)有颜色(颜色的种类小于等于20)的物品,你有一个篮子最多能装5件物品,每次从这4堆物品里面任取一件物品放进篮子里,但是取每堆物品时,必须先取上面的物品,才能取下面的物品,如果发现篮子里的两种物品的颜色一样,那么把这两种物原创 2014-05-26 17:58:41 · 426 阅读 · 0 评论 -
hdu 4293
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4293思路:这题dp的状态比较难想,dp[i]表示前i个人最多有多少人说真话,而num[i][j]表示当前人的前面有i个人,后面有j个人的个数,于是有dp[i]=max(dp[i],dp[j]+num[j][n-i])(0 1 #include 2 #include 3 #inc原创 2014-05-26 18:00:02 · 369 阅读 · 0 评论 -
hdu 1422(环上最长连续子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 222222 7 int level[MAXN]; 8 int dp[MAXN]; 9原创 2014-05-26 17:59:45 · 404 阅读 · 0 评论 -
hdu 4679(树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679思路:一开始看到题目的时候完全没什么想法,然后就跟着网上的解题报告学的,总算是理解的还行。做法:先找一条最长路,如果去掉的边不是这条最长路的,那么直接就是最长路乘上权值,否则的话,以最长路的两端进行双向dfs,每次求出某节点以下子树中的最长路。http://paste.ubuntu.com原创 2014-05-26 18:04:15 · 414 阅读 · 0 评论 -
loj 1036(dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25913思路:易证存在一条从左上角到右下角的折线,沿着格子边缘的...其中处于折线下方的全部运送到左边去,其他运送到上边去...那么这个折线就相当于从上面走到下面得分最大...直接dp就可以。 1 #include 2 #include 3原创 2014-05-26 18:08:45 · 359 阅读 · 0 评论