acm_动态规划
文章平均质量分 76
ascii991
这个作者很懒,什么都没留下…
展开
-
poj 1682
这是一道好题。我首先想到的是dp,用f[i][j][k]表示x处理了i个,y处理了j个,z处理了k个。f[i][j][k]=min(f[i-1][j-1][k]+w[i][j],f[i][j-1][k-1]w[j][k],f[i-1][j][k-1]+w[i][k])后来发现不对,转移时不是单纯的取min。后来看了他人的题解,发现可以对x,y;y,z;x,z分别做一次二维的dp,然原创 2012-04-11 08:39:57 · 970 阅读 · 1 评论 -
poj 1625 AC自动机上的DP
好题!搞了N久终于AC!【题意】给定N个字符集合和P个禁用的字符串,求长度为M的合法字符串个数。【题解】显然是AC自动机上的DP。令dp[i][j]表示长度为i,状态为j的字符串个数。按自动机的图转移即可,但要注意细节。贡献几组数据。50 50 10qwertyuiop[]\asdfghjkl;'zxcvbnm,./ QWERTYUIOP{}|A原创 2012-04-15 11:25:03 · 1642 阅读 · 0 评论 -
poj1853 特殊的背包
【题意】给定n个实数,将其分成两组,使得两组的和的差【解答】其实就是求两组的差最小。但实数不好处理,即使放大到整数,也会太大,时间空间复杂度大大提高。这就是考验你是否被以前遇到的模型束缚住的时候了!其实还是可以用背包的,看似简单,但思路还是很有趣的。#include using namespace std;bool f[30000];int d[30000]原创 2012-04-11 11:25:52 · 1371 阅读 · 1 评论 -
poj 1038 状态压缩dp 四进制压缩
黑书上的牛逼题状态压缩,每个格子有0,1,2三种状态。0表示这个格子为空,1表示这个格子到下一行为空。2表示这个格子到下下一行为空。如果以(x,y)这个格子为左上角放2*3的矩形,则(x,y)=(x,y+1)=(x+1,y)=(x+1,y+1)=(x+2,y)=(x+2,y+1)=2。如果以(x,y)这个格子为左上角放3*2的矩形,则(x,y)=(x,y+1)=(x,y+2)=(x+1原创 2012-08-02 17:07:13 · 1140 阅读 · 0 评论 -
并查集练习---poj 1417 并查集+DP
这到题倒是和team them up 有些类似。很容易得到:回答yes ,则x和y是相同集合的,反之,则是不同集合的。首先用friend-enemy 并查集,注意:不要将朋友和敌人分开维护,这样容易出错。得到了若干集合,每个集合有两个数,a和b。现在要求n个集合中各挑出一个数(a或者b),使得他们之和等于p1(说真话的人数)。而这个用dp可以很好的解决,用f[i][j]表示原创 2012-07-28 14:28:57 · 1410 阅读 · 0 评论 -
poj 1925 spiderman
首先,这道题有两种做法。第一种是先枚举位置,再枚举楼进行dp。第二种是先枚举楼,再枚举位置。然而蜘蛛侠的行进路线有对称性的。相当于将一号楼沿着某一座楼对称过来,就像镜子一样。根据对称性,蜘蛛侠在放出绳子时的高度永远是h[1]。因此,第二种方法中枚举位置时,可以根据蜘蛛侠所在的高度和楼的高度两个条件,缩小第二层枚举的范围。因此,第二中方法更加优秀。【代码】#include #inc原创 2012-08-14 13:38:22 · 1193 阅读 · 1 评论 -
POJ 2057 The lost house
这道题求的是期望。首先,一看到期望,就会想到可以将问题分成若干个子问题,再分开算期望,所以这道题可以使用动态规划。注意到每个叶子有房子的概率是均等的。所以答案就是遍历每个叶子最少的步数/叶子的总数。所以问题划归为求遍历所有叶子的最少步数。我们令fail[x]为以x为根的子树找不到房子的最少步数。su[x]为以x为根的子树中找到房子最少步数。le[x]为以x为根的子树中叶子的原创 2012-08-14 14:04:51 · 1219 阅读 · 0 评论 -
poj 2486 apple tree
显然是一道树上的分配问题。自然而然想到树上的背包。但要注意,这道题有两种情况。1、往下遍历,并最后返回根节点。2、往下遍历,并停留在某处结束,不返回根节点。令第一种为f[x],第二种为g[x]。求g[x]时,要枚举究竟是哪个儿子是往下遍历,最后停留在某处结束,不返回根节点的。所以复杂度为O(N*N*K*K)【教训】在叶子这里的边缘状态设置:f[x][0]=f[x原创 2012-08-14 14:22:12 · 980 阅读 · 0 评论 -
双调TSP问题总结---poj 2677和usaco5.4 canada tour
双调TSP指的就是从最左边的城市出发,从左往右遍历一些城市,到达最右端,再从最右端从右往左返回出发城市,然后最优化某些东西。poj 2677 就是要遍历所有的城市,最小化行走的距离(欧几里德距离)usaco canada tour 就是每个城市最多遍历一次(出发点两次),最大化遍历的城市数量。【解答】显然从左往右,从右往左都是一样的,都可以变成从左往右。我们称前者为上行路线,后者为原创 2012-08-16 15:24:06 · 2795 阅读 · 0 评论 -
poj 2817 wordstack
数据规模很小,不免让人想到搜索。但10!=3628800还是不够优秀。考虑到每次选择只与前一次选择有关,且N注意理解题意,允许两个单词中位置相同的字母不同,只是要求位置相同的字母相同的数目最大即可。可以在dp前做一些预处理。【代码】#include #include #include #include #include using namespace std;原创 2012-08-18 16:12:22 · 704 阅读 · 0 评论 -
poj 3156 用hash存状态的DP
NEERC2006的题,有点难度,好题。题目大意:给一个有n个点,m条边的无向图,两点之间可以存在多条边。现在每次随机增加一条边,问使得全部点都连通需要增加多少次(期望值)。求期望的题,由于期望的线性性,自然想到dp首先是状态表示,f(s1,s2,s3,...sn)表示当前合并到了有n个连通分量,每个连通分量有s1,s2,s3,...sn个点,且s1则有两种转移:一种是连边原创 2012-04-11 09:07:33 · 1178 阅读 · 0 评论 -
poj1185 状态压缩的dp
NOI炮兵阵地,经典题!【题意】略【解答】我一开始的思路是基于三进制的,0表示这个方格不受控制,1表示这个方格收到距离为1的方格的控制,2表示这个方格收到距离为2的方格的控制。后来发现有点烦!所以换了一个。令f[i][j][k]表示第i行,i-1行状态为k,i-2行的状态为j。j,k均为01串,1表示有炮。则状态转移就很方便了,这里留作思考。【优化】上述算法的时间复杂度还是原创 2012-04-11 11:39:32 · 804 阅读 · 0 评论 -
poj 1636 动态规划
【题意】有两个监狱,每个监狱里面有n个囚犯,现在希望交换n/2对囚犯。但是考虑有一些原本在不同监狱的囚犯对在一起是很危险的,所以希望经过交换后他们还是不在一个监狱里面。那么如果保证这个条件,希望尽可能多的交换囚犯。【题解】和team them up这道题类似。所有危险囚犯对是可以分割整个二部图为几个集合的,也就是说,比如位于1号监狱的甲如果需要到2号监狱,那么位于2好监狱的所有原创 2012-04-27 09:48:55 · 3802 阅读 · 0 评论 -
poj 2004
字符串DP【题意】给定n个字符串,求最长的单词链。两个单词能连起来,当且仅当这两个串只相差一个字符(不考虑顺序),且后者比前者长1。【题解】DP水,字符串内排序+TRIE。【代码】#include #include #include using namespace std;const int maxn=10010;struct node{ nod原创 2012-04-15 17:07:39 · 587 阅读 · 0 评论 -
APIO2009 抢掠计划
【题意】给一张图,每个点有一个ATM机,而其中的部分点是酒吧(可作为终点)。抢掠计划就是从起点(1号点)出发,到终点的途中,将ATM机中的钱抢走。问最多能抢到多少钱。【题解】很显然,由于图可能有环,所以自然地想到了SCC+DP。题目不难,但数据很大,堆栈会溢出。表示懒得模拟堆栈了。【代码】{$M 100000000}uses math;type edge=r原创 2012-04-15 17:30:22 · 1832 阅读 · 0 评论 -
poj 1887 最长不上升子序列
水爆了#include #include using namespace std;int a[200000],b[200000];int n,i,j,ans,cc;int main(){ freopen("pin.txt","r",stdin); freopen("pou.txt","w",stdout); while (++cc) {原创 2012-04-17 17:20:23 · 757 阅读 · 0 评论 -
poj 1160 谈四边形不等式
转自:http://www.cnblogs.com/staginner/archive/2012/03/12/2391925.html 我们可以用f[i][j]表示建好i个邮局时覆盖到第j个村庄的最优解,那么就可以得到f[i][j]=min{f[i-1][k]+w[k+1][j]}(k 这个题目还可以用四边形不等式去优化,实际上四边形不等式优化难点不在于应用,只是在转载 2012-05-07 14:52:47 · 3927 阅读 · 0 评论 -
poj 1180 dp 斜率优化
【题意】N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。 从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需 要时间的总和(同一批任务将在同一时刻完成)。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。(1原创 2012-05-08 10:50:10 · 1991 阅读 · 2 评论 -
topcoder SRM 501 div1 level1
Problem Statement Fox Ciel was very bored, so she invented a single player game. The rules of the game are:You start with 0 points. You make exactly nA+nB moves. You have two ty原创 2012-05-19 10:44:00 · 599 阅读 · 0 评论 -
SRM 492 div1 level 2
There is a kingdom with N cities numbered 0 throughN-1. Gogo wants to survey several cities in the kingdom. These cities are described in int[]cities containing M elements. He wishes to survey cit原创 2012-05-25 17:44:04 · 564 阅读 · 0 评论 -
poj3345 树型DP
这题不难,输入较繁,典型的树形dp题目大意:一共有n(在树上背包,代码:for (k=0;k { y=g[x][k]; for (i=num[x];i>=0;i--) for (j=0;j if (dp[x][i-j]+dp[y][j]原创 2012-04-11 09:20:56 · 1646 阅读 · 1 评论 -
poj 2778 AC自动机DP
从AC了poj1625 censored!一题后,又解决了一道AC自动机DP题。【题意】同poj 1625【题解】poj 1625是dp,而这道题的DP通过矩阵实现。【代码】#include #include using namespace std;const int maxn=100,base=100000,kind=4;struct node{原创 2012-05-02 15:05:28 · 662 阅读 · 0 评论 -
poj 2938 Economic Phone Calls
此题的核心就是选择,按时间顺序进行选择的话,可以发现每次选择只和当前选择的集合中时间最晚的电话有关。所以可以dp。令f[i][j]为处理了前i个电话,当前选择的电话中最晚的电话为j时,选择的最少电话数。对于i而言,如果选择i,则有f[i][i]=min{f[i-1][j]},其中1同时,如果i是今年的电话,则除了上面的转移,还有f[i][i]=min(f[i][i],f[i-1][原创 2012-08-18 16:25:22 · 652 阅读 · 0 评论