
DP
文章平均质量分 67
Neutralzz
这个作者很懒,什么都没留下…
展开
-
POJ1185(炮兵阵地) 状压DP
每一行的状态是取决于上一行和上上一行的,所以每次更新的时候需要记录当前行的状态和下一行的状态,然后再进行递推。。。不过估算了一下复杂度是10的11次方,吓得我都没敢写啊!!!看了一下别人的博客,居然真有这样写过的,于是就自己实现一边啦【最后看了以下讨论版,处理一下复杂度可以降低的,最后贴讨论版代码】思路:令P为1,H为0。用一个数组存下每一行的状态。1.先有数组num[] 存下各个状态的1原创 2015-06-27 00:09:18 · 521 阅读 · 0 评论 -
hdu 2224 经典DP 双调旅行商问题
双调旅行商问题有专门的DP算法,可参考(讲的很详细了)http://blog.youkuaiyun.com/xiajun07061225/article/details/8092247#include#include#include#include#include#includeusing namespace std;const int maxn = 205;const int转载 2015-06-06 13:14:01 · 442 阅读 · 0 评论 -
hdu3339 dijkstra + dp
先用dijkstra求出各点的最短路,然后就是一个很裸的背包了。#include#include#include#include#includeusing namespace std;const int maxn = 105;const int inf = 0x3f3f3f3f;int n,m,total;int dp[10500];int wgh[maxn];原创 2015-06-07 09:19:48 · 313 阅读 · 0 评论 -
HDU 2833 Floyd应用
好题!!先用floyd求任意两点间的最短路,然后有maps[u][i] + maps[i][j] + maps[j][v] = maps[u][v]。枚举i、j。#include#include#include#includeusing namespace std;const int maxn = 305;const int inf = 1e8 + 5;int n,m,u1,转载 2015-06-10 09:10:13 · 289 阅读 · 0 评论 -
HDU 3681 Prison Break (状压DP+二分)
题意:给你一个n*m的图,机器人只能上下左右移动,移动一格消耗一点能量,F是起点,D是不可经过的点,S是空地,G是充能的站点,Y是必须经过的点,整个过程机器人必须让自己的能量尽可能的少,并且经过所有的Y,问机器人的最小能量容量是多少。思路:因为‘G’和‘Y’的数量和T小于等于15,所以用这个来表示状态。设'Y'的点数为Y。那么F标号为0,'Y'的点依次标号为1,2,....Y 。‘G’标号原创 2015-07-08 08:45:45 · 293 阅读 · 0 评论 -
SGU 495 Kids and Prizes (概率DP入门)
设dp[i] 为前i个winners获得pizza的期望。状态转移方程: dp[i+1] = dp[i]*dp[i] / N + (dp[i] + 1)*(N - dp[i]) / N 。代码:#include#includeusing namespace std;const int maxm = 100005;double dp[maxm];int n,m;原创 2015-07-09 21:18:16 · 363 阅读 · 0 评论 -
POJ 3744 Scout YYF I(概率DP+数学)
不考虑地雷,设f[i]为在i位置上的概率。有f[i] = p * f[i-1] + (1 - p) * f[i-2]。考虑地雷的话分段算就好了,然而这个问题的关键在于怎么求这个f[i]。开始看见这个用的矩阵快速幂,,,结果T了【话说别人也有这样做没T的,但看了半天不知道怎么优化所以就打算求f[i]通项【就是靠数学咯算出来f[n] = f[1] * (1 - (p - 1)^原创 2015-07-10 09:13:21 · 721 阅读 · 2 评论 -
HDU 4405 Aeroplane chess(概率DP入门)
开始把dp[i] 设成了 从0到>=i的期望值。。。。然后差点跪了。。。确实是个水题。。不过头脑灵活一下。思路:设dp[i] 为从i到>=n的期望值。如果i有航班,dp[i] = dp[mark[i]];如果有航班,dp[i] = sigma(dp[i+j]) / 6 + 1 ( 1代码:#include#include#includeusing n原创 2015-07-10 08:58:33 · 276 阅读 · 0 评论 -
HDU 4336 Card Collector (状压+概率DP)
题意很短略去不说。思路:设dp[S] 为已集齐状态S中的各卡片后集齐所有卡片的期望值。那么方程为dp[S] = 1 + sigma(dp[S + {v}] *p[v]) + (1 - sigma(p[v]))*dp[S] (v是S中不包含的状态)代码:#include#includeusing namespace std;const int MAX = 20000原创 2015-07-12 23:16:51 · 343 阅读 · 0 评论 -
HDU 4035 Maze (很好的概率DP)
做了有些概率和期望的题目了,现在觉得大致有那么两种办法。【说白了还是要靠数学一、直接利用组合计数求解。二、通过状态转移列出方程来,如果能递推就直接DP,不能的话,通过对式子处理,找出式子之间的关系和结构上的特点,通过待定系数来进行迭代,最后求出结果。。。。再有的话就是用容斥啊状压啊什么的【估计自己也不一定想得到言归正传来说题吧,我把自己的思路写在注释里了。参考题解:点击原创 2015-07-12 21:55:09 · 305 阅读 · 0 评论 -
HDU 2151 Worm (记忆化搜索) 水题
题意略。思路:设dp[i][j]为当前位置为i,剩余时间为j到达终点的方案数。dp[T][0] = 0;dp[i][j] = dp[i-1][j-1] + dp[i+1][j-1]。我的代码:#include#include#includeusing namespace std;const int maxn = 105;int n,p,m,t;int d原创 2015-07-11 23:54:40 · 346 阅读 · 0 评论 -
HDU 3853 LOOPS (概率DP水题)
题意略去不说。思路: 设dp[i][j] 为从(i,j)出发到终点的期望值。方程:dp[i][j] = 2 + p[i][j][[0]*dp[i][j] + p[i][j][[1]*dp[i][j+1] + p[i][j][[2]*dp[i+1][j] 。(注意p[i][j][0] = 1时 dp[i][j] = INF)我的代码:#include#include#原创 2015-07-11 23:49:29 · 485 阅读 · 0 评论 -
POJ 2096 Collecting Bugs (概率DP入门)
今天看了kuangbin博客里的概率DP总结http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html开始的一句话感觉很有道理(概率正推,期望逆推)【不过谁能给我详细讲一下,现在只是感觉上很有道理设dp[i][j]为已找到i种bug和j个subconponent后到达目标的期望。那么dp[i][j] 可以转化成原创 2015-07-10 23:32:01 · 331 阅读 · 0 评论 -
POJ 3071 Football (很好的一个概率DP)
题意:1...2^n个队伍比赛,每一轮所有的队伍按照顺序两两比赛。比如说第一轮就是1对2,3对4。给出一个矩阵P= [pij] ,pij表示i队打败j队的概率。求最后哪个队伍最有可能拿冠军。思路:设dp[i][j] 为在第i轮中j胜出的概率。那么dp[i][j] = sigma(dp[i-1][k]*p[j][k]) k是在第i轮中所有有可能与j对战的队伍。问题的关键是怎么找出k。原创 2015-07-12 00:05:17 · 280 阅读 · 0 评论 -
ZOJ 3640 Help Me Escape (概率DP)
题意很好理解,略去不说了。思路:设dp[i]为战斗力为i时走出洞穴的期望。先对c[]从小到大排序。再二分查找c>=i的位置。那么期望逆推得 dp[i] = (t1 + t2 + ......tk-1 + dp[i+ck] + 1 + ..... dp[i+cn] + 1) / n。我的代码:#include#include#include#include#i原创 2015-07-12 00:18:40 · 330 阅读 · 0 评论 -
HDU 4418 Time travel (高斯消元求期望) 好题
这题上来就没读懂题。。。。。。题意:一个人在数轴上向左或向右走,走到头就改变方向,每次走,走i步的概率为Pi。求从起点到终点的步数的期望。思路:这个题的关键一步在于把向左和向右这两个起初状态变为一个状态。做法是把原先n个位置变成2*n-2个位置。举例:01234 ------> 01234321 这样 如果开始是从2向左走,就等价于从第7个位置开始往右走。这样需要注意终点可能会原创 2015-07-12 00:27:01 · 436 阅读 · 0 评论 -
ZOJ 3329 One Person Game (概率DP)
题意:三个多面体,面数分别为K1,K2,K3。每个面标号1,2,...,K。投掷一次,如果是a,b,c,那么把计数器设为0,反之,计数器加上(a + b + c)。如果计数器大于n,游戏结束,反之继续投掷。求投掷次数的期望值。思路:设dp[x]为从计数器为x时开始投掷,投掷到>n的期望值。那么方程为dp[x] = 1 + dp[0] / k1 / k2 / k3 + sigma(dp[x原创 2015-07-11 12:12:04 · 245 阅读 · 0 评论 -
HDU 4341 Gold miner (分组背包)
题意:每个金子有自己的位置,得到所用的时间和价值。要想得到某个金子,必须先得到从原点到目标连线的所有金子。求给出时间内获得的最大价值。思路:把在同一直线的金子视为一组,对于每个金子,把原点到目标的所有的金子的时间和价值都加到目标上,然后分组背包就不必多说了。我的代码:#include#include#include#include#includeusing na原创 2015-07-11 23:39:07 · 264 阅读 · 0 评论 -
ZOJ 3380 Patchouli's Spell Cards( 概率DP)
题意:用n个数填充m个位置,问有大于等于l个相同数字的概率。这个题看了很多题解,大部分代码都是有点问题的,一开始dp的状态都是一样的。(具体见下)思路:设dp[i][j] 为用前i个数填充j个位置的方案数。则dp[i][j] = sigma(dp[i-1][j-k] * C[m-j+k][k]) (k >= 0 && k 最后的结果应该是(n^m - dp[n][m]) / n^原创 2015-07-12 16:29:11 · 323 阅读 · 0 评论 -
HDU 4089 Activation (概率DP 好题)
做DP题关键的第一步就是确定状态,上来状态错了,这题百分之八九十就没法做了,其实就那几个关键的变量,我上来一般是凭直觉确定状态,卡住了的话,取一两个变量代入试试咯。这个题一开始状态的确定卡了一下。。。思路:设dp[i][j] 为i个人,Tomato 在第j个位置时达到目标状态的概率。那么j的取值要分为三种情况。dp[i][1] = p[1]*dp[i][1] + p[2]*dp[i原创 2015-07-13 10:25:18 · 407 阅读 · 0 评论 -
HDU 2476 String painter (区间DP)
题意:两个字符串A,B,一次操作可以把一段字符改为任意的相同字符,问把A改为B的最小操作次数。这是我第一个区间DP,参考题解:点击打开链接思路:这题实际上是两个DP。一、第一个dp是求出把空字符串变为字符串B 的最小操作次数。设dp[i][j] 为把空字符串i到j变为对应的字符串B的最小操作次数。那么就有dp[i][i] = 1;状态转移方程为:dp[i][j] = min原创 2015-07-13 22:12:39 · 289 阅读 · 0 评论 -
POJ 2411 Mondriaan's Dream (状压DP)
题意:用宽为2,高为1的小矩形,拼成一个h*w的大矩形,问有多少种拼法。开始想的时候,从下往上不断铺,考虑每一行的铺的方式,对于每一行的第i个格,如果被横放的矩形覆盖的话,状态为1,如果被竖放的矩形覆盖的话,状态为0。想了一种状态转移,但是复杂度太大了。然后想到最后结果是最后一行全铺满的情况。。如果不铺满又怎样。。那么让每一行的第i个格,如果被覆盖就为1,不被覆盖就为0,然后方程就出来了。原创 2015-07-07 18:36:22 · 281 阅读 · 0 评论 -
HDU 1074 Doing Homework (状压DP + 路径记录)
前面虽然自己已经了几篇状压DP的题解,但是这道题才是我的第一道状压DP题。题意:有n个任务,每个任务有两个属性(d :最后期限 c :需要用的天数),主人公必须一项一项完成任务,并且每个任务完成的时间每超出最后期限一天,就要被扣一分。问他能被扣的最少的分数。多情况字典序输出方案。设dp[S] 为完成状态S中的所有任务的被扣最少分数。那么dp[S] = min(dp[S]原创 2015-07-07 21:10:16 · 338 阅读 · 0 评论 -
HDU 3001 Travelling 三进制状压DP
题意:一个图,每个点都要遍历到,且每个点最多经过两次。思路:用三进制表示状态,第i位上的数(0,1,2)代表第i+1个点经过的次数。设dp[S][v]为状态S下,到达S状态中的点v的最小花费。S0 为 状态S中第v-1位的值-1后的结果 ,其他位上的值不变。那么状态转移方程:dp[S][v] = min(dp[S0][u] + maps[u][v],dp[S][v]).(u在状态S原创 2015-07-07 17:51:19 · 449 阅读 · 0 评论 -
POJ 3311 Hie with the Pie (状压DP)
题意:n+1个点 从0出发,遍历所有的点最后回到0,每个点可访问多次,求最小花费。思路:因为每个点可访问多次,所以用一下floyd预处理一下图就好了,然后就是个TSP。设dp[S][v] 为遍历状态S中的每一个节点,且最后到达S中的v的最小花费。状态转移方程:dp[S][v] = min(dp[S][v],dp[S - {v}][u] + maps[u][v]).我的代码:原创 2015-07-07 19:04:29 · 290 阅读 · 0 评论 -
POJ 1651 Multiplication Puzzle(区间DP 水题)
题意很短略去不说了。思路:设dp[i][j] 为区间i到j的最大分数。状态转移方程:dp[i][j] = max(dp[i][j] , dp[i][k-1] + dp[k+1][j] + a[k]*a[i-1]*a[j+1]);我的代码:#include#include#includeusing namespace std;const int maxn =原创 2015-07-16 15:04:47 · 361 阅读 · 0 评论 -
HDU 4632 Palindrome subsequence(区间DP 回文子串的个数)
题意略。思路:设dp[i][j] 为i到j内回文子串的个数。那么状态转移方程为dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1]如果a[i] = a[j] ,dp[i][j] += (dp[i+1][j-1] + 1)。我的代码:#include#include#includeusing namespace std原创 2015-07-16 18:06:43 · 1901 阅读 · 0 评论 -
POJ 3186 Treats for the Cows (区间DP 水题)
题意略。思路:设dp[i][j]为买出i到j的最大收益。状态转移方程:dp[i][j] = max(dp[i+1][j] + a[i]*(n - j + i) , dp[i][j-1] + a[j]*(n - j + i));我的代码:#include#include#includeusing namespace std;const int maxn = 2005;原创 2015-07-16 16:38:29 · 288 阅读 · 0 评论 -
UVA 10688 The Poor Giant (区间DP)
题意:有n个苹果,第i个苹果的重量为k+i。其中只有i个苹果是甜的,比它轻的苦,比它重的酸,Giant想要找到甜苹果,必须要通过吃掉某个苹果然后判断甜苹果的位置,吃苹果的时候必须全部吃掉。问在找到甜苹果的过程中的所有情况吃掉苹果重量的最小值。例如:n = 4 , k = 0.Gaint先吃第2个。如果第2个是甜的,那么甜苹果是2如果第2个酸,那么甜苹果是1如果第2个苦,再吃第3个就原创 2015-07-16 16:47:25 · 297 阅读 · 0 评论 -
ZOJ 3735 Josephina and RPG (概率DP)
题意:有r个角色,i角色打败j角色的概率为p[i][j].游戏有n轮,每轮都会有一个角色与你对战,游戏开始你可以选择一个角色进行游戏,每轮结束后如果你胜出,可以进行下一轮,并且可以把自己使用的角色更换为刚打败的角色,求通关的最大胜率。思路:设dp[i][j]为在第i轮用j角色通关的最大概率状态转移方程:dp[i][j] = p[j][a[i]] * max(dp[i+1][j],dp[原创 2015-07-16 16:29:03 · 666 阅读 · 1 评论 -
ZOJ 3469 Food Delivery (区间DP)
题意:在x坐标轴上,饭店位置是X,需要送餐的n个地点位置在Xi,每个地点每多等一分钟,不满意度会增加Bi,求给所有的地点送完餐后的最小不满意度的和。思路:先对各个地点按x从小到大排序。用sum[i]来存取0到i每等一分钟累计不满意度的和。设dp[i][j][0]为给区间i到j的送完餐且最后到达i后累计的不满意度的和,dp[i][j][1]为给区间i到j的送完餐且最后到达j后累计原创 2015-07-16 14:45:49 · 273 阅读 · 0 评论 -
UVA 10891 Game of Sum (区间DP)
题意:有n个数,两个玩家A、B,每个玩家在他那一轮可以从左端或右端取连续的一段数,把数的和加到自己的分数上,假设每个玩家都采取尽可能的让自己的分数更高,那么A玩家最后和B玩家分数的差为多少(A玩家先手)思路:设dp[i][j][0]为自己先手在区间i到j内最后获得的最多的分数dp[i][j][1] 为对方先手在区间i到j内最后获得的最多的分数那么状态转移方程:dp[i][j][原创 2015-07-16 17:52:16 · 281 阅读 · 0 评论 -
HDU 2196 Anniversary party (树形DP 水题)
题意:一个森林,每个节点都有一个值,每个节点和他的父节点不能同时出现,求出现的节点的值的和的最大值。思路:dp[i][j] 为以i为根节点的树的最大值的和,j = 0说明根节点存在,j =1说明不存在。我的代码:#include#include#include#includeusing namespace std;const int maxn = 6005;int n,原创 2015-07-16 22:29:07 · 259 阅读 · 0 评论 -
HDU 2196 Computer (经典树形DP)
本文出自点击打开链接本人代码:#include#include#include#includeusing namespace std;const int maxn = 100005;struct Nod{ int b,val,next; void init(int b,int val,int next){ this->b = b;this->转载 2015-07-17 08:49:04 · 288 阅读 · 0 评论 -
POJ 2955 Brackets (区间DP 经典括号配对)
题意略。思路:设dp[i][j]为区间i到j的regular brackers的最大长度。状态转移方程:如果a[i]和a[j]配对,那么dp[i][j] = dp[i+1][j-1] + 2;dp[i][j] = max(dp[i][j],dp[i][k] + dp[k+1][j]);我的代码:#include#include#includeusing原创 2015-07-16 15:14:55 · 401 阅读 · 0 评论 -
HDU 4745 Two Rabbits (区间DP)
题意:n个石头排成一个环,每个环有自己的重量,两只兔子从两个石头上出发,每一轮从一个石头跳到另一个石头,一个顺时针,一个逆时针,并且同一时间两只兔子所在的石头重量相等。每只兔子不能跳到并且跳过自己曾在的石头。问最多进行多少轮。思路:把n个石头排成一排,再取n个石头和前n个石头一样,成2n个石头。比如说1121变成11211121然后把这2*n个石头排成一个环,求这个环内的最长回文子串的原创 2015-07-16 18:33:47 · 262 阅读 · 0 评论 -
POJ 3162 Walking Race (树形DP)
这个题的关键点在于怎么求出上下界思路:先像上一篇一样求出每个点到达的最大距离,用mlen[]记录下来。然后用multiset去维护区间的最大值和最小值,因为multiset是升序的。复杂度O(nlogn)我的代码:#include#include#include#include#includeusing namespace std;const int ma原创 2015-07-17 13:03:04 · 256 阅读 · 0 评论 -
HDU 3507 Print Article (斜率优化DP)
题意:一篇文章打印成多行,每行可以有任意数目个字符,打印成一行的代价为sigma(ci)^2+m,求总的最小代价。思路:设dp[i]为考虑前i个字符的最小代价,s[i]为从第1个字符到第i个字符的代价和。那么枚举与第i个字符同行的字符个数得方程:dp[i] = min(dp[i] , dp[j] + (s[i] - s[j])^2 + m)。然后斜率优化复杂度降到O(n)。斜率DP原创 2015-07-30 10:23:26 · 329 阅读 · 0 评论 -
HDU 2829 Lawrence (斜率优化DP)
题意:炸铁路,每段连通的铁路的价值为两个直接或间接相连的点对的权值积的和,求炸m次的最小总价值。思路:设dp[i][j]为炸i次,考虑前j个站点的总价值。那么方程为dp[i][j] = min(dp[i][j],dp[i-1][k] + val(k+1,j))。val(k+1,j)的值为k+1到j的各项权值的 和的平方 减去 平方的和 后再除以2。然后就可以写出斜率形式。原创 2015-07-30 10:33:17 · 293 阅读 · 0 评论 -
POJ 1155 TELE (树形DP+背包)
思路:设dp[i][j]为在以i为根节点的子树中,连接j个用户的最大收益。u为父节点,v为子节点,那么dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]+cost)。实现过程注意加上break,不然容易T。。。代码:#include#include#include#includeusing namespace std;co原创 2015-07-19 10:17:51 · 276 阅读 · 0 评论