随笔分类 -  Topcoder

摘要:题意:有n个等长的string(设string的长度为m),string中的字符从'A'到'Z',容许对m列执行稳定的排序操作,问说是否能通过这m种操作将这n个string调整成对应的顺序。题解:为了保证区间[0, n)有序,考虑最后一个操作,该操作使得某一列在区间[0, n)中是有序的,这个操作将... 阅读全文
posted @ 2014-05-20 21:43 litstrong 阅读(181) 评论(0) 推荐(0) 编辑
摘要:记录dp(i, j)表示前i种卡片的排列,使得LISNumber为j的方法数。#include #include #include #include using namespace std;typedef long long int64;const int M = 1000000007;int64 dpC[1300][40];int64 dpT[1300][40];int64 sum[40];int64 dp[40][1300];class LISNumber {private: vector num;public: int64 f(int i, int j); int co... 阅读全文
posted @ 2013-07-28 13:31 litstrong 阅读(180) 评论(0) 推荐(0) 编辑
摘要:可以化简为求n条线段的最大覆盖问题,需要注意的是对于实数而言。#include #include #include #include #include #include using namespace std;class PiecewiseLinearFunction {private: map Y2i; int value[100];public: int maximumSolutions(vector Y) { for (int i = 0; i ::iterator it = Y2i.begin(); it != Y2i.end(); it++) { ... 阅读全文
posted @ 2013-07-28 13:28 litstrong 阅读(191) 评论(0) 推荐(0) 编辑
摘要:题面见这,给一个多边形,有N个顶点,依次连接多边形上的顶点,要求每条线段要至少与之前的某条线段相交,且最终回到原点,求全部的方案数。需要发现具体的方案数与之前的访问的点的顺序是没有关系的,和具体的集合是有关系的,采用动态规划解决该问题。#include <iostream>#include <algorithm>#include <vector>#include <string>using namespace std;const int M = 18;long long dp[1 << M][M];bool check(int mas 阅读全文
posted @ 2013-04-19 16:21 litstrong 阅读(134) 评论(0) 推荐(0) 编辑
摘要:Problem Statement题目的意思很简单,一只乌龟从起始点A开始,执行N条命令,命令有四种,向左、右转一定的角度,向前、后爬行若干距离,问说如何安排着N条命令,使得最后到达的终点B离A最远,给出这个最远的距离。如果命令只有前进和旋转的话,易知不旋转,直接前进到不能前进是最优的,后退同理。当有前进和后退同在时,将不在一起的前进的命令都抽取出来从最初的位置开始接起,根据向量相加是不变的,该结果不变,而根据之前提到的,直着连是最优的,所以要直着连,而且直接拿过来的等价情况还可能不能达到(因为包含旋转的角度),但已经不重要了,因为不管如何摆,都没有直着摆要优,同理后退的情况。所以处理的方法就 阅读全文
posted @ 2012-03-28 22:59 litstrong 阅读(229) 评论(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 阅读(202) 评论(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) 编辑
摘要:CubePacking的题意是这样的,有Ns个1*1*1和Nb个L*L*L的立方体,对这些立方体打包,要求正交放置,问说最小用多大的长方体盒子,思路是枚举盒子,然后把东西往里放。 枚举就是要去除那些重复的项,即枚举满足x<=y<=z且x*y*z<=n的(x,y),这个的复杂度说是只有O(N^(2/3)),那样的话对于N是INT_MAX的话,也是可以接受的。然后放置那些立方体,求最小的高,复杂度是O... 阅读全文
posted @ 2011-06-20 12:45 litstrong 阅读(189) 评论(0) 推荐(0) 编辑
摘要:这次在DIV1挂蛋了。250的题大意是这样的,给一个1<=x<1000000007,对x只能执行两种操作4x+3或者8x+7,问说最少能用几步到达1000000007 * a(a属于自然数),最多只能扩展到100000步,否则输出-1,刚开始以为BFS的话,状态数会太多,就找其中的规律,可惜不够敏感4x+3,8x+7都是2^n*x+2^n-1的这种形式,对于这种形式的两种操作是可以等价... 阅读全文
posted @ 2010-08-06 11:30 litstrong 阅读(172) 评论(0) 推荐(0) 编辑
摘要:这种比赛,看得和平时的SRM一样,我是来打酱油的。本来是5.1晚12点做的,可悲剧的是TC服务器不知道出了什么事,跟上回一次做SRM似的,Compile不了,Submit不了,郁闷坏了,老期待呢,结果却没做成,不过可能也是好事,250题做的比较慢,拿到250,直接就去看Sample了,可是题目自我感觉比较拗口,DNA链要放过来匹配。错过了早提交的机会,结果就到了提交高峰期了,然后TC服务器就悲剧了... 阅读全文
posted @ 2010-05-03 12:41 litstrong 阅读(352) 评论(0) 推荐(0) 编辑
摘要:DIV2250的题过以前难了一点点,submit的很顺利,500的题很长,看了半天,没看懂,再者,见到那字符串就没啥胃口了,看1000的题,想了想,有了思路,但不确定是否可以,那个时候还40来分钟吧,然后就悲剧了,写的很搓,手慢。到Challenge结束后,才写完并Debug完,看DIV2中过的人,也是那样类似哈密顿DP的方法过的。大意:有张图,记顶点1...n,A,B,要让A尽可能经过1..n中... 阅读全文
posted @ 2010-04-20 21:11 litstrong 阅读(272) 评论(0) 推荐(0) 编辑

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