2012年8月3日

[集合DP] UVA 10651 Pebble Solitaire

摘要: 根据题目描述,每次变换都减少了一个石子,所以只要求出初始状态最多可以变换多少次,用初始状态石子数目减去这个变换次数就得到最后剩余最少的石子的数目;最多有12位,用一个 int 表示状态,状态的转移可以用位运算实现。 1 /* 2 UVA 10651 - Pebble Solitaire 3 */ 4 # include <cstdio> 5 # include <cstring> 6 7 char s[20]; 8 int f[5000]; 9 10 bool move(int &x, int i, char d)11 {12 int t = (x>> 阅读全文

posted @ 2012-08-03 17:01 getgoing 阅读(317) 评论(0) 推荐(0) 编辑

[简单DP] UVA 10051 Tower of Cubes

摘要: DAG上的DP,六个方向,打印不要求字典序,相反方向可以通过异或得到(定义0-5代表题目所说的五个方向);f[i, p] = 1;for (k = 1:i-1) f[i, p] = max(f[i, p], f[k, q]+1) if (color[i][p^1] == color[k][q]) 1 /* 2 UVA 10051 - Tower of Cubes 3 */ 4 # include <cstdio> 5 # include <cstring> 6 7 # define N 500 + 5 8 # define F 6 9 10 const char s[F 阅读全文

posted @ 2012-08-03 16:03 getgoing 阅读(247) 评论(0) 推荐(0) 编辑

[单调队列] UVA 10534 Wavio Sequence

摘要: 单调队列,Staginner的分析;关键在于正确性和最优性的证明:正确性:通过单调队列的维护,不会得到比实际最长串更大的长度;最优性:通过单调队列的维护,能得到不小于最长串的长度; 实际存在的最长串在出现之后,单调队列的长度不会小于这个最长串的长度(替换不改变长度,只有进队时增加了长度),而之前出现的较大的队列尾会被替换,较小的会被较大的通过入队的方式更新。 1 /* 2 UVA 10534 - Wavio Sequence 3 */ 4 # include <cstring> 5 # include <cstdio> 6 7 # define N 10000 + 5 阅读全文

posted @ 2012-08-03 15:13 getgoing 阅读(294) 评论(0) 推荐(0) 编辑

[简单DP] POJ 1651 Multiplication Puzzle

摘要: 一看就知道是矩阵链,但是忘了矩阵链具体是怎么做的了,记的是把区间划分开来DP。定义f[i, j]为 i-j 内的最小值(初始是1-n),如果第 k 个为最后选的数,那么 f[i, j] = f[i, k]+f[k,j]+a[i]*a[k]*a[j];需要注意的是边界条件:如果区间内不含选取的数(i+1==j)最小值应该定义为0。 1 /* 2 POJ 1651 Multiplication Puzzle 3 */ 4 5 # include <cstdio> 6 # include <cstring> 7 8 # define N 100 + 5 9 # define 阅读全文

posted @ 2012-08-03 10:26 getgoing 阅读(227) 评论(0) 推荐(0) 编辑

[简单DP] POJ 2192 Zipper

摘要: 给出三个串a b c,问 c 是否能由 a b 串中的字符通过混合得到,要保持同一个串中两个字符的前后关系不变。状态:f[i ,j] 表示长度为 i 且使用了b串 j 个字符(使用 a 串 i-j 个字符),布尔型,表示状态是否可达。状态转移: f[i, j] = f[i-1, j] && f[i-1, j-1],对于边界f[0, 0] = true。也可以令 f[i, j] 为使用了 a 串 i 个字符、b 串j个字符是否可达,如下: 1 /* 2 POJ 2192 Zipper 3 */ 4 # include <cstdio> 5 # include < 阅读全文

posted @ 2012-08-03 09:46 getgoing 阅读(201) 评论(0) 推荐(0) 编辑

导航