02 2012 档案

摘要:Problem Statement这次的CF有道题涉及到对一个数进行质因子分解,对最糟糕情况没写好,导致TLE。枚举的素数最多只有sqrt(N)。Double Profiles这题是给一个无向图,求点对u-v,使得u和v的邻接点个数相等,将各个点的邻接点集合进行hash,最后比较hash的值,这里有个技巧解决了当u,v之前有边的情况:每个点记录的值除了邻接点以为,还包括自己。 阅读全文
posted @ 2012-02-28 19:34 litstrong 阅读(171) 评论(0) 推荐(0) 编辑
摘要:Problem Statement给定一个矩形的棋盘,上面要么填"#",要么填".",问说能否找到一条路径,上面放着棋盘中所有的"#",且相邻两个点的行编号和列编号间隔相等。建立一个二分图,左边是行,右边是列,上面的"#"在二分图中表示为一条边,若两个点行编号相等,则这两个点在二分图中对应的边邻接于左部的点。因此所要求的路径对应与二分图中的交错的欧拉路径,这样完成了从哈密顿路到欧拉路的转换。#include <iostream>#include <vector>#include <st 阅读全文
posted @ 2012-02-27 15:34 litstrong 阅读(233) 评论(0) 推荐(0) 编辑
摘要:Problem Statement这题的描述比较复杂,就不说了。整个过程类似一个游戏,参数有天,生命值,胜利的概率,最后求最大存活的期望天数。用dp[i][j]表示当前生命值为j,考虑了从i...N这些巫师的攻击。有一点观察很重要,就是如果考虑巫师在同一天的话,那么安排他们的order与最后的结果是无关的,而对于每个巫师,要么攻击她,要么不攻击她。还有一个要注意的是,巫师的状态决定了当天是那一天,而哪天并不能决定是哪个巫师,因此应该将巫师设为状态,而不应该是天。由于下面的LP--后,后面忘了求的是原来的LP,导致最后的几个case wa掉了。#include <iostream># 阅读全文
posted @ 2012-02-26 13:31 litstrong 阅读(201) 评论(0) 推荐(0) 编辑
摘要:Problem Statement题目大意是给定N个有序数字,delete一个数字a[x],产生能量a[x - 1] * a[x + 1],问说产生的最大能量是多少,第一个和最后一个不能delete。反过来考虑,insert操作,动态规划。#include <iostream>#include <vector>using namespace std;int dp[55][55];class CasketOfStar{public: int go(vector<int> w, int L, int R) { if(dp[L][R]) return dp[L][ 阅读全文
posted @ 2012-02-24 15:12 litstrong 阅读(241) 评论(0) 推荐(0) 编辑
摘要:Problem Statement题目大意是给定一个N*M的棋盘,然后棋盘上染色,要求染色满足这样的条件,染色块的四领域内的染色块数为偶数。用dp[i][j][k]表示1..i行,第i行放置状态为j,奇偶性为k的方案数,用f[i][j][k]表示放置状态为j,奇偶性对应为k的方案数,其中判断奇偶性时用到二进制处理,最后的复杂度为O(N*4^M),内存方面要用滚动数组优化,解题报告的做法是用三进制,本来没用到f[i][j][k],实现了一个O(N*8^M)的算法,就是在状态转移的时候又枚举了一下,这样在TC上会超时,用了一个中间数组f存储了中间结果,并优化下存储就可以了~using namesp 阅读全文
posted @ 2012-02-23 15:13 litstrong 阅读(173) 评论(0) 推荐(0) 编辑
摘要:很有趣的一道题目,套了两个动态规划。Promblem Statement题目大意是有N个顶点,需要连M条无向边,要求两个顶点A, B的序号满足0 < |A - B| <= K,K<=8,问说一共有多少种方案。f[i][j][mask][k]表示考虑顶点0...i,使用j条边,前从i往前的K个顶点加上自己的的位状态是mask,并且考虑从i到i - k的连边方案的总方案数。则f[N - 1][M][0][K]就是答案。当顶点i处未连出边,则退化成i-1的情况。否则考虑从i到i-k的连边,如果不选择边,且i到i-k的连边继承自从i到i-(k-1)的连边,所以直接传递;如果选择边,则 阅读全文
posted @ 2012-02-22 17:03 litstrong 阅读(222) 评论(0) 推荐(0) 编辑
摘要:Problem Statement给定N个数,要求选出P个数(可以重复),使得每个数至少出现一次,且重复出现的数之间至少间隔M个数,问说有多少种可能。参考解题报告,可以用动态规划的方法来做,基于这样的一个观察,连续的M+1个数肯定是两两不同的,所以可以一个一个选,还没选过的数可以直接选进去,还有就是除了那M个不同的数以外,任选一个数进来,可以保证两两不同。同时可以用容斥原理来做,先忽略掉每个数至少出现一次这个条件,可以结合之前的那个观察,得出一个结果,具体参加这里。#include <iostream>#include <string>#include <vect 阅读全文
posted @ 2012-02-21 13:56 litstrong 阅读(184) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示