上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 20 下一页
摘要: Problem Statement题目的意思很简单,一只乌龟从起始点A开始,执行N条命令,命令有四种,向左、右转一定的角度,向前、后爬行若干距离,问说如何安排着N条命令,使得最后到达的终点B离A最远,给出这个最远的距离。如果命令只有前进和旋转的话,易知不旋转,直接前进到不能前进是最优的,后退同理。当有前进和后退同在时,将不在一起的前进的命令都抽取出来从最初的位置开始接起,根据向量相加是不变的,该结果不变,而根据之前提到的,直着连是最优的,所以要直着连,而且直接拿过来的等价情况还可能不能达到(因为包含旋转的角度),但已经不重要了,因为不管如何摆,都没有直着摆要优,同理后退的情况。所以处理的方法就 阅读全文
posted @ 2012-03-28 22:59 litstrong 阅读(232) 评论(0) 推荐(0)
摘要: Problem Statement这次的CF有道题涉及到对一个数进行质因子分解,对最糟糕情况没写好,导致TLE。枚举的素数最多只有sqrt(N)。Double Profiles这题是给一个无向图,求点对u-v,使得u和v的邻接点个数相等,将各个点的邻接点集合进行hash,最后比较hash的值,这里有个技巧解决了当u,v之前有边的情况:每个点记录的值除了邻接点以为,还包括自己。 阅读全文
posted @ 2012-02-28 19:34 litstrong 阅读(175) 评论(0) 推荐(0)
摘要: Problem Statement给定一个矩形的棋盘,上面要么填"#",要么填".",问说能否找到一条路径,上面放着棋盘中所有的"#",且相邻两个点的行编号和列编号间隔相等。建立一个二分图,左边是行,右边是列,上面的"#"在二分图中表示为一条边,若两个点行编号相等,则这两个点在二分图中对应的边邻接于左部的点。因此所要求的路径对应与二分图中的交错的欧拉路径,这样完成了从哈密顿路到欧拉路的转换。#include <iostream>#include <vector>#include <st 阅读全文
posted @ 2012-02-27 15:34 litstrong 阅读(236) 评论(0) 推荐(0)
摘要: Problem Statement这题的描述比较复杂,就不说了。整个过程类似一个游戏,参数有天,生命值,胜利的概率,最后求最大存活的期望天数。用dp[i][j]表示当前生命值为j,考虑了从i...N这些巫师的攻击。有一点观察很重要,就是如果考虑巫师在同一天的话,那么安排他们的order与最后的结果是无关的,而对于每个巫师,要么攻击她,要么不攻击她。还有一个要注意的是,巫师的状态决定了当天是那一天,而哪天并不能决定是哪个巫师,因此应该将巫师设为状态,而不应该是天。由于下面的LP--后,后面忘了求的是原来的LP,导致最后的几个case wa掉了。#include <iostream># 阅读全文
posted @ 2012-02-26 13:31 litstrong 阅读(207) 评论(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 阅读(248) 评论(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 阅读(177) 评论(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 阅读(242) 评论(0) 推荐(0)
摘要: Problem Statement给定N个数,要求选出P个数(可以重复),使得每个数至少出现一次,且重复出现的数之间至少间隔M个数,问说有多少种可能。参考解题报告,可以用动态规划的方法来做,基于这样的一个观察,连续的M+1个数肯定是两两不同的,所以可以一个一个选,还没选过的数可以直接选进去,还有就是除了那M个不同的数以外,任选一个数进来,可以保证两两不同。同时可以用容斥原理来做,先忽略掉每个数至少出现一次这个条件,可以结合之前的那个观察,得出一个结果,具体参加这里。#include <iostream>#include <string>#include <vect 阅读全文
posted @ 2012-02-21 13:56 litstrong 阅读(188) 评论(0) 推荐(0)
摘要: 总结下割点,割边,次小生成树问题这些日子复习算法,学习了次小生成树和割点割边,在这简单记录下算法思路。次小生成树:对一颗树定义一个这样的变换f(T),意思是选一条在最小生成树T'上的一条边,并且该边不在T中。将它加入T,然后去掉环中不在T'上的一条边,这样可以保证w(f(T)) <= w(T),经过一系列变换后,就可以从T变到T'了。然后求次小生成树,也就是变换的倒数第二颗树了,具体做法是,枚举一条不在T'上的边加入T'中,然后删掉一条环中权重最大的边,取最小值即可。由于要维护任意两个点u, v之间最大的边,所以复杂度是O(V^2)。割点:无向图割 阅读全文
posted @ 2011-12-29 16:21 litstrong 阅读(357) 评论(0) 推荐(0)
摘要: http://c.chinaitlab.com/special/sjms/Index.htmlhttp://www.cnblogs.com/userinterface/archive/2005/04/15/138074.html 阅读全文
posted @ 2011-10-26 16:31 litstrong 阅读(109) 评论(0) 推荐(0)
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 20 下一页