动态规划
文章平均质量分 82
Crux_D
这个作者很懒,什么都没留下…
展开
-
ZOJ 2278 Fight for Food
相当出色的DP优化题。类似于最大不下降子序列,一般有O(N2)的简单算法。但N>30000,故需要优化。原先的算法中,设F(i)= 到第i只老鼠时捕捉到的最大数目,F(i)= max(F(j)+1),j从1到i-1,假如在时限内能从第i到第j只老鼠出现的方格。这里可以预先使用BFS,用time[rati.i][rati.j][ratj.i][ratj.j]来记录从i到j的最小时间,并加以判断。为了原创 2008-02-11 14:34:00 · 989 阅读 · 1 评论 -
ZOJ 2834 Maximize Game Time
07年浙大赛的一题。TreeDp。感谢某位不知名牛人。 /**//*每次遍历子结点来进行DP过程。每个结点保留下3个值,以它为跟的树所有结点值的和(结点数)totel,进行到这个结点的最优值finish,以及不能走到当前结点,子结点最多可以走的数目。这样,每个结点的3个值都可以通过所有子结点的值来确定。计算完毕后,需要注意的是这题里的数据可能是一个森林,不在要求树中的所有结点可以全部原创 2008-04-21 13:58:00 · 1289 阅读 · 1 评论 -
ZOJ 1827 The Game of 31
博弈的题目。123456各四张花色,游戏开始时从中抽掉一些牌。每人一次抽取一张相加,和大于31者失败。求必胜策略。设定状态表示为行动结束时剩下的sum。假如每种牌无限制张数,那么就等于抢七,必胜态为0、7、14、21、28。但是当给定一些牌的时候,只能搜索。类似记忆化搜索,注意:牌数量不同,节点的状态也不同。当抢到必胜态之后,上一个可以到达必胜态的节点一定是必败态。以无限制扑克战为例,原创 2008-04-23 19:54:00 · 1334 阅读 · 0 评论 -
ZOJ 2852 Deck of Cards
什么是郁闷?就是把整段代码从头至尾天翻地覆修改了一遍之后,发现错误出现在最不起眼的地方。今后出现if...if...if...else的时候一定要小心,很可能就把原来的意思搞反了。不难的DP题。方程是C[n,a,b,c] = max(C[n-1,a-v[i],b,c],C[n-1,a,b-v[i],c] ,C[n-1,a,b,c-v[i]]);,无非写起来要考虑清楚几种不同状况。#in原创 2008-04-25 12:46:00 · 1595 阅读 · 0 评论 -
ZOJ 1918 Ferry Loading II
设f(i,j)表示第i次运输能将第j辆车运到对岸,抵达时所花的最小时间。f(i,j)=f(i-1,j-k)+回岸的时间T+T。当然,若回岸时车还未到达,f(i,j)=j车抵达的时间+T。 #include cstdio>#include string>#define min( x, y ) ( x #define max( x, y ) ( x > y ? x : y )int T原创 2008-05-03 16:29:00 · 999 阅读 · 0 评论 -
HDOJ 2167 Pebbles
这种类型的题目似乎很常见——方格棋盘,搜索某种状态。你也许会大喊:“嘿,伙计,为什么不再来一份?……”但是我就他喵的又敲了2个钟头,其中莫名其妙的错误就和绵羊身上的毛一样多。在这之前我要承认这是一道很繁琐的题目。第一题目没有给出棋盘的长宽,需要处理字符串;第二当你敲下第200行代码之后再简单的题也会突然变得复杂起来。单纯的搜索是不可能的。N*N= 225,这样的数据规模已经注定了纯搜的原创 2008-05-15 22:23:00 · 740 阅读 · 0 评论 -
TCSRM 400 ReversalChain
记忆化搜索,类似邮局问题的dp。以下解法byACRush。对于每一种string a -> string b,都有一个最小的转换步数。对长度分层考虑,当a首字符和b首字符相同时继续,当a首字符和b末字符相同时就可以调转。class ReversalChain ...{ map string, int > m; int minStep ( string a, string原创 2008-05-27 22:57:00 · 651 阅读 · 0 评论 -
SRM397 CollectingMarbles
Maybe you dont know, but you are a fanatic of colored marbles. You want to collect them all, but you may not be able to carry them. You have numberOfBags bags, each of capacity bagCapacity grams. The原创 2008-06-03 11:21:00 · 582 阅读 · 0 评论 -
ZOJ 1039 Number Game
记得很久前写过,博弈的题目大同小异,要注意的就是两点: 1、状态的表示 2、状态之间的转换:只要能达到必败态,就是必胜态。反之就是必败态。起点为必败态。 另外,数组作为参数传递时是指针传递。 #include #include int cs, n;int list[21];int move[21], len;int b[60000原创 2009-01-13 19:01:00 · 771 阅读 · 0 评论 -
Zoj 2315
对于一棵树而言,记录下包含此结点的最大num和不包含此节点的最大num,进行dp。 我发现自己每每写完一题,就再也不想多写一个字,以至于解题报告如同旧时的电报,惜字如金。 #include #include using namespace std;enum{ SIZE = 500001,};struct Node{ int p; //原创 2009-02-01 11:48:00 · 867 阅读 · 0 评论 -
ZOJ 1346 Comparing Your Heroes
AndyZh说过:“我们想求一堆人的排列总数,它等于在这一堆人中 减去 每一个 入度为 0 的人,剩下的人的排列总数的和。具体实现也借助了回溯法。如果只剩下一个人,那么排列总数为1,这是递归的边界。 ” #include cstdio>#include string>#include map>using namespace std;int M, N, a[16][16];cha原创 2008-04-17 19:43:00 · 1225 阅读 · 0 评论 -
归并排序和求逆序数对
合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法原创 2008-04-06 13:10:00 · 2777 阅读 · 4 评论 -
ZOJ 1819 Rhyme Schemes
下午搞了五道菜题,还看了一场冠军杯录播,生活真充实。此题相对而言稍嫌繁琐。排列组合的题目,大致上从小到大顺推即可。设b[i][j]中i表示字符串长度,j表示字符串中用到的字母个数,不难推出b[i][j] = b[i-1][j-1] + b[i - 1][j] * j。当题目无法变得更难的时候,出题者就会使出高精度加法。事实上,这也只不过多打几行而已…… #include cst原创 2008-04-02 17:13:00 · 1013 阅读 · 0 评论 -
ZOJ 1353 Unimodal Palindromic Decompositions
设当前的总和为i,最外层的数字为j,把最外层“剥去”后,剩下依然是满足要求的数列,且总和为i-2j,最外层的数字>=j。即为:F(i,j)=∑F(i-2j,k) #include cstdio>#include string>int N;double f[300][300];void dp ();void pt ();void print ();int main ()...{原创 2008-03-04 23:47:00 · 959 阅读 · 0 评论 -
ZOJ 1554 Folding
做了两天的一道DP题。本来也是做不出的,幸好世界上有一种叫做大牛的恐怖生物。AndyZh和ZC果然强悍,在两年前就已经把这道题解决了。贴个ZC的解题报告:这题是一道最优化问题,此类问题一般使用搜索和动态规划,这题显然可以使用后者。 我们先来看看一个简单的例子: AAAAABBBBCCCCCDDDD,显然压缩后为5(A)4(B)5(C)4(D)。 我们先不考虑这个串是如何压缩的,我们先考虑它是怎原创 2008-03-04 22:03:00 · 836 阅读 · 0 评论 -
ZOJ 1463 Brackets Sequence
几乎和1554 Folding是一样的题目,区别是这更简单一点。LRJ黑书里拿做动态规划例题的第一道。类似邮局问题的划分,注意左右有挂号时的状态。 1#include cstdio> 2#include string> 3 4#define min(x,y) ( x 5 6int T, m[101][101], L, ch[101][101]; 7char st原创 2008-03-04 21:59:00 · 802 阅读 · 0 评论 -
ZOJ 2711 Regular Words
假设F(a,b,c)表示在当前拥有ABC/的数量分别为abc,那么F(a,b,c)=F(a-1,b,c)+F(a,b-1,c)+F(a,b,c-1)。看上去很简单,实际上的操作有两个难点。1. F(a,b,c)相当大。采用高精度加法。2.a的取值范围相当大。只能使用char数组。 #include cstdio>#include string>int N;char f[61原创 2008-03-04 21:53:00 · 931 阅读 · 0 评论 -
ZOJ 2091 Mean of Subsequence
设i开头的子序列中,产生最小平均值的序列结尾下标为x[i]。那么考虑x[i]确定之后的情况。a[i-1]如果比(i,x[i])的平均值小,那么x[i-1] = i-1。反之如果大于(i,x[i]),那么显然应把x[i]赋值于x[i-1]。但是仍然有问题。考虑10,2,3,2的情况。设下标为1-4。x[4] = 4,x[3]=4,x[2]=2,x[1]=2。但是实际情况中,x[1]=4。为何原创 2008-03-12 14:02:00 · 1001 阅读 · 0 评论 -
ZOJ 1227 Free Candies
记忆化搜索。在表达篮子里糖果的状态时采取位操作。记录f(x1,x2,x3,x4)代表当第i列娶到xi个时的最大糖果数量。然后……强搜吧,没什么好说的。也许还可以剪枝,但时限在暴力搜索面前都不堪一击。位操作是相当有趣的hash方法,我得好好练习一下。#include cstdio>#include string>int a[40][4], f[41][41][41][41], N,原创 2008-03-13 12:49:00 · 1342 阅读 · 1 评论 -
ZOJ 1721 The Doors
一道很好的DP题。预处理每个点对之间是否能直接到达,然后状态很容易划分。#include stdio.h>#include string.h>#include math.h>#define _0 1e-10int N, b[20][4][20][4], ll;double f[20][4];typedef struct...{ double x, y[4];} Wall;Wall w原创 2008-03-18 23:55:00 · 701 阅读 · 1 评论 -
ZOJ 1100 Mondriaan's Dream
中等难度的DP。铺砖问题,有组合数学公式。 但是用搜索+dp的方法更……好吧,也很难做。研究了一个下午的标程,终于搞懂。把每一层的砖块压缩为二进制编码,搜索上一层到当前层的状态转化是否能够达到。然后从0到11……11Dp。void dfs ( int n, int from, int to ) 表示当前从左往右有n块砖,from表示前n块砖在这一层的编码,to表示下一层。修改了一下,使得1原创 2008-03-22 16:44:00 · 4590 阅读 · 1 评论 -
ZOJ 2775 Push Button Lock
标程里用了非常漂亮的位操作,特摘录如下。used 代表当前使用过的数字情况。move代表每一次使用的数字,比如134就是1101。b[used]代表在used情况下能够组成的序列数量。b[i] = ∑(b[i|j]+1) ,j 从1到maxn且j不能和i重叠(i&j == 0)。加1是只取到新的j这种情况。细节地方需要仔细考虑。#include cstdio>#include s原创 2008-03-20 17:27:00 · 878 阅读 · 0 评论 -
POJ 1848 Tree
懒得再写一遍。 三个状态,表示包含root点,不包含root点,不包含root点和任意一条链的子树最优值。 #include #include #include using namespace std;#define INF 9999999int N;vector t[101];int f[101][3];int used[101];原创 2009-06-21 12:51:00 · 901 阅读 · 0 评论