摘要: 最大子矩阵和问题=。=最朴素的方式是枚举矩阵左上角的点和右下角的点,然后计算和,复杂度是n^4这里可以利用动态规划来进行优化枚举子矩阵的起始行i和终止行j,然后将其求和使其转化为一维的数组,然后利用动态规划在O(n)的复杂度内求出最大和即可。复杂度是n^3对于n#include #include #include using namespace std;const int maxn = 105;const int INF = INT_MAX / 2;int sum[maxn][maxn],v[maxn][maxn],t[maxn];int maxsum(int *f,int n) { i... 阅读全文
posted @ 2014-03-17 22:48 acm_roll 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 题意大概是,2,3,5,7的和他们的整数倍数的数都称为Humble Number,将所有的Humble Number从小到大排列,现在输入N(N #include #include #include using namespace std;typedef long long LL;#define min_t(a,b) (((a)<(b))?(a):(b))LL min(LL a,LL b,LL c,LL d) { return min_t(min_t(a,b),min_t(c,d));} LL dp[6000];void init() { int l1 = 1,l2 = 1,l3 ... 阅读全文
posted @ 2014-03-17 22:35 acm_roll 阅读(145) 评论(0) 推荐(0) 编辑
摘要: Problem DescriptionGardon和小希玩了一个游戏,Gardon随便想了一个数A(首位不能为0),把它去掉一个数字以后得到另外一个数B,他把A和B的和N告诉了小希,让小希猜想他原来想的数字。不过为了公平起见,如果小希回答的数虽然不是A,但同样能达到那个条件(去掉其中的一个数字得到B,A和B之和是N),一样算小希胜利。而且小希如果能答出多个符合条件的数字,就可以得到额外的糖果。 所以现在小希希望你编写一个程序,来帮助她找到尽可能多的解。 例如,Gardon想的是A=31,B=3 告诉小希N=34, 小希除了回答31以外还可以回答27(27+7=34)所以小希可以因此... 阅读全文
posted @ 2014-03-17 22:21 acm_roll 阅读(224) 评论(0) 推荐(0) 编辑
摘要: Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 1) 当前的话与前面的某些真的话冲突,就是假话; 2) 阅读全文
posted @ 2014-03-17 22:14 acm_roll 阅读(240) 评论(4) 推荐(0) 编辑
摘要: 题意是给定n个大写字母组成的字符串。选择尽量多的串,使得每个字母的出现次数为偶数。 可以把每个单词转化成01串,然后用异或操作处理。 这里如果枚举所有情况的话复杂度是2^n,白书上面介绍了一种中途相遇法,可以把复杂度降低到2^(n/2)*logn甚至更低 方法是先穷举前n/2异或的所有可能值,如果有相同的保留最大的,可以用hash或者map存储映射关系。 然后穷举后n/2的所有可能值... 阅读全文
posted @ 2014-02-16 15:54 acm_roll 阅读(506) 评论(0) 推荐(0) 编辑
摘要: 简单的扫描算法 #include #include #include using namespace std;const int maxn = 1005;int T,M,N,mat[maxn][maxn],right[maxn][maxn],left[maxn][maxn],up[maxn][maxn];int main() { scanf("%d",&T); while(T--) { int... 阅读全文
posted @ 2014-02-16 12:54 acm_roll 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 假设有两个小孩子在跑道上面跑,如果跑道视环形的,那么速度快的那个小孩一定能追上速度慢的那个。 #include #include #include #include #include using namespace std;int next(int k,int n) { long long s = (long long)n; s = s * s; int len = log10(s) + ... 阅读全文
posted @ 2014-02-16 11:00 acm_roll 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 寻找一个序列中和不小于S的最短子序列,n的时间预处理出前缀和,然后枚举末位置二分初始位置nlogn搞定#include #include #include using namespace std;const int maxn = 100001;int A[maxn],B[maxn];int main() { int n,S; while(~scanf("%d%d",&n,&S)) { int ans = 0; for(int i = 1;i = S) { if(ans == 0) ans = i - str + 1; else ans = min(ans,i 阅读全文
posted @ 2014-02-16 10:54 acm_roll 阅读(314) 评论(0) 推荐(0) 编辑
摘要: LA3971 Assemble你有b块钱,给出n个配件的个子的种类,性能和价格,每种类型的配件买一个,价格不超过b,因为有水桶效应,所以电脑的性能取决于性能最低的配件的性能,问你b块钱配的电脑性能最高有多少。按照白书的说法,最大值尽量小,最小值尽量大之类的问题一般都可以用二分答案的方法来结局,这道题就是一道典型的最小值最大问题,所以采用二分答案#include #include #include #include #include #include #include #include using namespace std;const int maxn = 1005;struct Compon 阅读全文
posted @ 2014-02-09 14:27 acm_roll 阅读(643) 评论(0) 推荐(1) 编辑
摘要: 汉诺塔问题的变形,给定初始局面和目标局面,问最少多少步可以把初始局面变成目标局面。找到初始位置和目标位置不同的最大盘子X,那么比这个盘子还大的盘子就可以无视掉了。因为他们既不会被移动也不需要被移动。我们设f(p[],x,final)为当前初始状态为p,要把比x小的盘子移动到柱子final的最少步数那么有f(p[],x,final)=f(p[],x-1,6-final-p[x])+2^(x-1)-1+1意思就是先把比x-1小的都移动到柱子6-final-p[x],然后把x-1移动到final,然后把比x-1小的盘子移动到final有了这个式子之后,我们要求的答案可以分解成,从开始局面开始,把比X 阅读全文
posted @ 2014-02-09 13:40 acm_roll 阅读(278) 评论(0) 推荐(0) 编辑