2012年3月6日
摘要: SGU_115 类似这种日期的问题貌似还是写几个小函数处理起来更明了一些。#include<stdio.h>#include<string.h>int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int M = 10, D = 21, W = 7;int equals(int m, int d, int mm, int dd){ if(m < mm) return -1; else if(m > mm) return 1; if(d < dd) return... 阅读全文
posted @ 2012-03-06 18:54 Staginner 阅读(286) 评论(0) 推荐(0) 编辑
摘要: HDU_1059 本来杭电上的PPT是把这个题目放到生成函数里的,但是后来怎么搞都超时,于是还是用《背包九讲》里面的二进制优化的多重背包的思路去做了。#include<stdio.h>#include<string.h>#define MAXD 10#define MAXM 60010#define MAXX 200int S, M, X, f[MAXM], value[MAXX], elem[20];void prepare(){ int i, j, k; for(i = 0; i < 16; i ++) elem[i] = (1 << i);}in 阅读全文
posted @ 2012-03-06 17:31 Staginner 阅读(355) 评论(0) 推荐(0) 编辑
摘要: HDU_1709 这个题目还是满好玩的,砝码还可以放到异侧,因此如果用生成函数的话每项可以构造成(x^(-ai)+1+x^ai),然后展开的时候把x的负数次方的系数也算一下,但实际上还有更简单的处理方式,只要在计算x^(-ai)的系数的时候一并累加到x^ai上即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 110#define MAXM 20010int wa[MAXM], wb[MAXM], weight[MAXD], N, S, *a, *b, ans[MAXM]; 阅读全文
posted @ 2012-03-06 16:30 Staginner 阅读(296) 评论(0) 推荐(0) 编辑
摘要: HDU_1171 这个题目可以用生成函数的思路去做,也可以用多重背包的思路去做,而且用多重背包的思路做时可以参考《背包九讲》里面的二进制优化多重背包问题那一块,这样做效率更高。 另外多重背包问题用单调队列优化之后还可以达到O(VN)的效果,我暂时还没有学,所以就只写了这个二进制优化的版本。//生成函数#include<stdio.h>#include<string.h>#define MAXD 60#define MAXM 130000int N, S, M, value[MAXD], num[MAXD], wa[MAXM], wb[MAXM], *a, *b;void 阅读全文
posted @ 2012-03-06 15:25 Staginner 阅读(237) 评论(0) 推荐(0) 编辑
摘要: POJ_3064 这个题可以直接用生成函数的思路去做,但如果我们用f[i][j]表示到第i种蚂蚁时选了j个蚂蚁的方案种数进行dp的话,还可以得到时间复杂度更优的算法。 同时,这个题目让我意识到了取模运算(%)耗时确实比较长,用得越少越好……//生成函数#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXM 100010#define D 1000000int h[MAXD], wa[MAXM], wb[MAXM], A, B, S, T, *a, *b;void init(){ int i, j, 阅读全文
posted @ 2012-03-06 03:27 Staginner 阅读(630) 评论(0) 推荐(0) 编辑
摘要: HDU_1521 第一次做这种不能转化成类似e^x形式的指数生成函数的题目,一开始愣住了,还以为要想办法用整数分式来表示中间结果,后来发现只要用double处理就可以了。#include<stdio.h>#include<string.h>#define MAXD 15int N, M, a[MAXD];double f[MAXD][MAXD], fac[MAXD];void prepare(){ int i, j, k; fac[0] = 1; for(i = 1; i <= 10; i ++) fac[i] = i * fac[i - 1];}void so. 阅读全文
posted @ 2012-03-06 02:33 Staginner 阅读(457) 评论(0) 推荐(0) 编辑
摘要: HDU_2082 这个题目可以用完全背包的思路去解,也可以用计算生成函数的方法去解,最后把x至x^50的系数加起来即可。#include<stdio.h>#include<string.h>#define MAXD 30#define MAXM 60int f[MAXD][MAXM], a[MAXD];void solve(){ int i, j, k, ans; for(i = 1; i <= 26; i ++) scanf("%d", &a[i]); memset(f, 0, sizeof(f)); f[0][0] = 1; for 阅读全文
posted @ 2012-03-06 02:14 Staginner 阅读(187) 评论(0) 推荐(0) 编辑
摘要: POJ_3734 这个题目是《程序设计中的组合数学》中的一个例题,对于要求是偶数的,该项可以写成(exp(x)+exp(-x))/2,不做要求的可以写成exp(x),把4项乘起来化简可得生成函数G(x)=(exp(4*x)+2*exp(2*x)+1)/4,所以x^n/(n!)那项的系数就是(4^n+2*2^n)/4,也就是(2^(n-1)+1)*2^(n-1),之后用快速幂取模求得结果即可。#include<stdio.h>#include<string.h>#define D 10007int pow_mod(int n){ int ans; if(n == 1) . 阅读全文
posted @ 2012-03-06 02:06 Staginner 阅读(321) 评论(0) 推荐(0) 编辑
摘要: HDU_1085 这个题目可以用完全背包问题的思路去解,为了练一下生成函数,我就用生成函数的思路写了一下,构造生成函数G(x)=(1+x+x^2+…+x^n1)(1+x^2+x^4+…+x^(2*n2))(1+x^5+x^25+…+x^(5*n3)),最后按x,x^2…的顺序看哪一项的系数为0即可。#include<stdio.h>#include<string.h>#define MAXD 5#define MAXM 8000int f[MAXD][MAXM], elem[] = {0, 1, 2, 5}, num[MAXD], S;int init(){ int i 阅读全文
posted @ 2012-03-06 01:15 Staginner 阅读(211) 评论(0) 推荐(0) 编辑