|
|
Posted on
2010-02-11 16:42
Ryen_lee
阅读( 790)
评论()
收藏
举报
- History Grading(,111):DP上来就给个下马威,这题据说是LCS,首先题意就非常容易读错,看懂题意后,我想当然的定义了错误的状态转移方程(虽然是美好的O(n)),导致一直WA,后来改正后,用O(n^2)方法AC。由此肯见,状态的定义一定要好,并且要注意检查状态转移方程是否能满足状态的定义。
- Longest Common Subsequence(,10405):就是LCS, 注意输入可能有空行,需要返回0,这样输入函数也需要使用gets才行。gets读入失败时返回0。
- Coin Change(,674): 设置状态方程时要考虑可能出现重复的问题,使用定序方法解决,开始提交一直AC,由于题目告诉了最大可能N,所以使用预计算方法,只算一次,后来的测试用例直接查表得解。貌似该题可以使用滚动数组。
- Cutting Sticks(,10003): 简单的DP,使用记忆化搜索解决。注意状态转移方程的检查,以及边界条件的设置。(需要设置一下哑元边界)
- Expressions(3367,):思路是根据输入构造加法树,然后对树进行层次遍历即可(从最底层向上遍历)即可。
- The Falling Leaves(,699): 二叉树的递归构建,在构建的同时计数,使用两个数组一个记录正索引,一个记录负索引。
- Stacking Boxes(,103): 矩形嵌套,转化为DAG模型的典型DP,求有向无环图中最长路径。
- Is Bigger Smarter?(,10131):还是经典的DAG模型,注意在DP和打印答案时对特殊的启动初值需要特别处理。
- The Twin Towers(,10066):就是LCS,仔细处理下边界,由迭代解决。
- Vacation(,10192): 还是LCS, 注意LCS状态转移可以从前往后,也可以从后往前, 另外可以预设一个哑元边界,方便边界的处理。
- Unidirectional TSP(,116): 普通DP,关键是答案需要输出字典序最小的,并且矩阵式WARP的,这就导致了字典序需要仔细分析, 注意(i-1+row)%row的技巧保证warp的实现。 本题我贡献了6个WA,疯了。对比测试没有发现逻辑错误。
- Dollars(,147):解法完全和Coin Change一样,主要是输入输出有问题。浮点数由于精度问题,转型成整数时,需要加一个epsilon,防止因为精度转型成小一的整数。
(int)(0.29 * 100) == 28 (int)(0.57 * 100) == 56 (int)(0.58 * 100) == 57 (int)(1.13 * 100) == 112 (int)(1.14 * 100) == 113 (int)(1.15 * 100) == 114 //全部为真
- Let Me Count The Ways(,357): 竟然还是找零钱。查看题解,估计是用刷表法。
- Dividing coins(,562):直接可以转化为装载问题,使用简化的0-1背包代码水过。
- Game Show Math(,10400):使用DFS即可,不过输入由100层,必须要考虑效率问题,题目给的限制是15s,不过直接使用仍然TLE,使用记忆化搜索后就AC了。 一个memset(d,0,sizeof(0))的笔误让我贡献了三个WA。囧
- Bit Mask(,10718): 贪心法。从左向右逐位构造M, 具体方法是当N该位为0时,尽量使M该位为1,但要保证M<=U,当N位为1时,尽量使M该位为0,但要保证M>=L。 本题是利用贪心方法的构造性问题。
- Watering Grass(,10382):区间覆盖的变形问题,因为区间变成浮点,注意下精度问题,一遍过。
- Work Reduction(1907,): 简单的贪心,注意如果决定使用减法,则一定是一步到位。
- Graph Construction(,10720): 暴力贪心即可AC,每次对现有节点从大到小排序,然后每次解决最大度数点,如果能一直进行至结束,则PASS,否则不能构建。 贪心的证明还不清楚。当然该题在图论上有一个结论,也可以使用该结论计算:Graphic Sequence, 后者经过测试,速度会快点。前者(n^2logn)的效率竟然能PASS,还真是囧。
- Gone Fishing(1042,): 枚举+贪心,经典题。LRJ书上例题。
- The Fun Number System(1023,): 一道经典数学题,主要是进制的题目,通过pn模版确定可能表示的最大最小值,需要理解的是只要在这二者之间的任意值都可以被表示。 我通过将输入转换为其绝对值,使用无符号数表示,将原来的整数转换为目标编码。
- Optimal Array Multiplication Sequence(,348): 矩阵连乘,求乘法次数最小的原题。 练手下区间DP,顺利。答案打印需要递归下。
- Compromise(2250,):又是一道LCS, 不过我才发现LCS打印方案并不是很容易啊,额外记录了路径。
- CD(,624):装载问题,主要是答案打印比较麻烦。现在还是WA。(已解决,打印方案的BUG,由于题目接受多种不同方案,一直没看出来有一个测试用例是BUG,汗)
- SuperSale(,10130):开始以为是N个箱子同时对M个物体的超级背包,仔细一看原来是N个箱子分别对M个物体的简单背包。
- Homer Simpson(,10465):背包变种,优化目标变成了容量,要求容量越小越好,在容量最小的情况下,输出最大能得到权重和,使用迭代DP,定义两个状态,主状态表示容量最小可能剩余值,副状态表示满足约束的最大权重和,虽然副状态受主状态约束,但是使用迭代仍然可以循环一次算出二者。
- Longest Run on a Snowboard(,10285):简单的典型DP,由于所有状态完全等价,即没有初始状态,使用记忆化搜索,枚举所有状态找到最优值。
- The Tower of Babylon(2241,): DAG模型的DP,把每个BLOCK分成三个NODE,然后构成一个带权DAG,求解权值最大的路径即可。
- Bachet's Game(,10404):经典趣味题,拿火柴。 由于输入规模为一百万,使用记忆化搜索会栈溢出,改用迭代可以AC。 开始认为最终状态是1,其实仍然是0。
- Cellular Structure(,620):字符串递归处理, 题目给出的就是递归式,直接使用即可。
- Walking on the Safe Side(,825): 恶心的题目。是不能再简单的DP, 但是输入就恶心, 输出也恶心,注意最后一个测试样例的输出后不能再输出空行,否则WA。
- Perfect Hash(,188): 题意是为哈希函数确定他的一个系数C。确定方法题目已经给出,模拟即可。
- Wavio Sequence(,10534): 容易想到将问题转换为LIS问题,直接使用DP是O(n^2)会TLE, 用O(nlogn)的LIS通过。二分查找感觉用 X<=Y 好点
while(x<=y) { int m = x + (y-x)/2; if(f(m)) x = m+1; else y = m-1; } //此时x是查找元素的位置,若元素不存在,x是该元素在有序序列中插入的位置。
- Tower of Cubes(,10051): 很自然的DP, 其实也是一个DAG,1个CUBE分成六个节点,找图中最长的路径。迭代通过。题目要求方案打印,在迭代时记录每个状态的决策,然后递归后向打印。
- Pebble Solitaire(,10651):简单自然的DP, 对状态进行二进制编码,注意位运算。记忆化搜索通过。
 代码
/*将所有位置0*/ unsigned int quiz=0; /*将pos位置1*/ inline void set(unsigned int & ui,int pos){ ui|=(1<<pos); } /*将pos位置0*/ inline void clr(unsiged int & ui,int pos){ ui&=~(1<<pos); } /*将pos位翻转*/ inline void flip(unsiged int & ui,int pos){ ui^=(1<<pos); } /*测试pos位是否为1*/ inline void test(unsiged int & ui,int pos){ return ui&(1<<pos); }
- Always on the run(,590):题目看着玄乎,就是一个很简单自然的DP,使用迭代AC.
- e-Coins(,10306): 蛮力广搜即可,使用非取模队列需要十万的空间,需要二维数组判重。
- String to Palindrome(,10739): 字符串编辑距离的变种, 经典的基于递归的启发而导致的DP, 这种类型的思路都是从最简单的情况开始归纳出状态转移方程。
- Optimal Binary Search Tree(,10304): 经典问题,要理解啥是最优二叉查找树,DP类似于矩阵连乘,是区间模型。 对根节点选择时有一个优化策略。可以参看这篇文章。
- Chopsticks(,10271): 好题。开始准备使用区间模型, 发现时间复杂度为n*n*K。尝试使用线性模型,复杂度变为n*k。使用反序进行状态转换即可。
|