11 2012 档案

摘要:这次比赛题目明显较长,自己没耐心读题,心还是太急了。给自己总结了几个缺点:1.心太急,总想侥幸过掉。2.本能觉得有些题目很简单,考虑不充分,没想好思路就敲。3.草稿纸要书写规范,以免重复计算。4.题目长就耐心读题,没什么好抱怨的。5.独立思考能力还不够,总想依赖别人。日后做题要尽量避免这些情况。C题严重考虑错误。View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int main(){ int i, j; double y1, y2, yw, 阅读全文
posted @ 2012-11-26 11:59 To be an ACMan 阅读(222) 评论(0) 推荐(0)
摘要:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 50003#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define mid int m = (l + r)>>1int col[maxn<<2];int lsum[maxn<<2], msum[maxn<<2], rsum[maxn&l 阅读全文
posted @ 2012-11-24 19:43 To be an ACMan 阅读(163) 评论(0) 推荐(0)
摘要:View Code #include<stdio.h>#include<string.h>#include<algorithm>#include<vector>using namespace std;const int maxn = 8000<<1;#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define mid int m = (l + r)>>1int n;int col[maxn<<2];int vis[maxn< 阅读全文
posted @ 2012-11-24 18:15 To be an ACMan 阅读(191) 评论(0) 推荐(0)
摘要:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 65666<<1;#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define mid int m = (l + r) >> 1int col[maxn<<2], XOR[maxn<<2];bool vis[maxn<< 阅读全文
posted @ 2012-11-24 15:06 To be an ACMan 阅读(184) 评论(0) 推荐(0)
摘要:注意离散化View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define mid int m = (l + r)>>1#define maxn 10004int col[maxn<<4];int l[maxn], r[maxn];int a[maxn<<4], m, n;int 阅读全文
posted @ 2012-11-24 12:52 To be an ACMan 阅读(207) 评论(0) 推荐(0)
摘要:方法一:先暴力求出每个字串是否是回文(枚举每个回文串的中间字符),保存在dp[i][j]中再从以求的小区间滚成大区间View Code #include<stdio.h>#include<string.h>char s[5005];int dp[5005][5005];int main(){ int i, j, k, x, y; int len = strlen(gets(s+1)); for(i = 1; i <= len; i++) // 枚举每个回文串的中间字符 { for(j = k = i; j >= 1 && k <= le 阅读全文
posted @ 2012-11-22 20:56 To be an ACMan 阅读(774) 评论(0) 推荐(0)
摘要:出处:http://blog.csdn.net/lalor/article/details/7358956poj3461Oulipo最简单的KMP题,找出第一个字符串在第二个字符串中出现次数。View Codepoj2752SeektheName,SeektheFame求子串前缀跟后缀一样的各种情况View Codepoj2406PowerStrings求子串在主串中最多叠加次数View Codepoj1961Period跟上面一题几乎一样,把主串的每一种前缀当作小主串,如果小主串的子串在小主串中叠加次数大于1,输出小主串长度及叠加次数。View Code #include<stdio. 阅读全文
posted @ 2012-11-20 23:11 To be an ACMan 阅读(496) 评论(0) 推荐(0)
摘要:题意:求最长公共上升子序列。思路1:O(n^3) 算法用dp[i][j]为a串匹配到i,b串匹配到j时的最长公共上升子序列的长度。状态转移方程如下:dp[i][j] = max(dp[k][t]+1) (1<= k < i && 1 <= t < j && a[i] == b[j] && a[k] < a[i] && b[t] < b[j])dp[i][j] = max(dp[k][t]) (1<= k <= i && 1 <= t <= j && 阅读全文
posted @ 2012-11-16 23:12 To be an ACMan 阅读(294) 评论(0) 推荐(0)
摘要:注意:重复的只算一次如何去掉一些重复的是本题的关键我的去重思路:75 3 7 6 3 2 165 3 7 3 155 3 2 1 3第一组在推到 数字 2 的时候有 3会出现重复, 显然前面一个3是可有可无的。第二组也一样,前面一个3是可有可无的。1.如果最长下降序列中有后面一个3, 如第一二组数据,那么前面一个3是无用的,在推好后面一个3之后把之前的所用重复的计数数组清零2.如果最长下降序列中只有前面一个3,如第三组数据, 做情况1的操作也是不会影响结果的,因为第三组的前面一个3的状态已经推到2后才被清零的。View Code #include<stdio.h>#include& 阅读全文
posted @ 2012-11-15 22:02 To be an ACMan 阅读(402) 评论(0) 推荐(0)
摘要:View Code #include<stdio.h>#include<string.h>int a[50003];int f[50003], g[50003];#define inf 1000000000int max(int a, int b) { return a > b ? a : b;}int main(){ int i, j, cas, n; scanf("%d", &cas); while(cas--) { scanf("%d", &n); for(i = 1; i <= n; i++) 阅读全文
posted @ 2012-11-15 13:48 To be an ACMan 阅读(162) 评论(0) 推荐(0)
摘要:注意边界View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define inf 1000000000int max(int a, int b) {return a > b ? a : b;}int n, m;int a[103][103], dp[103][103];int main(){ int i, j; while( ~scanf("%d%d", &n, &m)) { for(i = 1; i 阅读全文
posted @ 2012-11-15 08:48 To be an ACMan 阅读(160) 评论(0) 推荐(0)
摘要:记忆化搜索:View Code #include<stdio.h>#include<string.h>#include<string>#include<iostream>#include<algorithm>using namespace std;#define inf 1000000000struct node{ int v, vis; // v 表示DP的值,加入的最少的括号个数,vis表示dp这一个状态是否被更新 string s; // 保存要输出的路径, string使用很方便,但时间相当费啊}dp[103][103];st 阅读全文
posted @ 2012-11-14 20:29 To be an ACMan 阅读(209) 评论(0) 推荐(0)
摘要:注意初始化View Code #include<stdio.h>#include<string.h>int dp[103][103];char a[103], b[103];int f[7][7];#define inf 1000000000int max(int a, int b, int c){ int x = a > b ? a : b; return x > c ? x : c;}void init(){ for(int i = 1; i <= 4; i++) f[i][i] = 5; f[1][2] = f[2][1] = -1; f[1][ 阅读全文
posted @ 2012-11-14 15:03 To be an ACMan 阅读(162) 评论(0) 推荐(0)
摘要:红色表示已经A。打星号的表示个人认为比较经典,或是算法比较好的题目1014* Dividing 半个背包,注意中断,否则可能TLE1036 Gangsters 可以很水的DP过,还有多种优化的方法1038* Bugs Integrated, Inc.状态压缩1050 To the Max最大子矩形 枚举每个列数为n的矩阵,然后对这些矩阵分别进行DP处理1080 Human Gene Functions最长公共子序列拓展,此题不连续,注意初始化1088滑雪 记忆化DP1141* Brackets Sequence括号序列 经典区间DP1157 LITTLE SHOP OF FLOWERS 注意. 阅读全文
posted @ 2012-11-14 13:34 To be an ACMan 阅读(4632) 评论(0) 推荐(0)
摘要:题意:一群匪徒要进入一个酒店。酒店的门有k+1个状态,每个匪徒的参数是:进入时间,符合的状态,携带的钱。酒店的门刚开始状态0,问最多这个酒店能得到的钱数。思路1:dp[i][j]表示时间0-i之间,门的状态为j时所能获得的最大利益转移方程 :dp[i][j]=max(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1])因为转移i只跟i-1有关,所以可以用滚动数组dp[2][k]有一个处理边界的好方法:j的范围 0 —k,不妨向右移动1位,并保证0,k+2时的状态为0代码1:View Code //O(k*t)#include<stdio.h>#include& 阅读全文
posted @ 2012-11-10 19:44 To be an ACMan 阅读(1107) 评论(0) 推荐(0)
摘要:让物体的重量等于价值,用总价值的一半的包去装这些物品,看其是否能装满View Code #include<stdio.h>#include<string.h>int dp[120005], a[8];int max(int a, int b) { return a > b ? a : b;}int main(){ int i, j, cas = 1, n, m; while( ~scanf("%d", &a[1]) ) { int sum = a[1]; for(i = 2; i <= 6; i++) { ... 阅读全文
posted @ 2012-11-10 15:32 To be an ACMan 阅读(329) 评论(0) 推荐(0)
摘要:关键:很巧妙的枚举思路,枚举回文字符串中间字符的位置i,复杂度O(n),然后统计 以i为起始位置的回文串的个数放在数组p[]中,以末尾位置的回文串的个数放在数组q[]中。最后处理一下即可View Code #include<stdio.h>#include<string.h>#define lld __int64char s[2006];int p[2006], q[2006];lld ans;int main(){ int i, j; int l = strlen(gets(s+1)); int a, b; for(i = 1; i <= l; i++) ... 阅读全文
posted @ 2012-11-08 13:58 To be an ACMan 阅读(215) 评论(0) 推荐(0)
摘要:边双连通分量求解要点:1.通过割点找变双连通分量。2.点入栈,当前边(u->v)的v点等于栈顶的点时停止出栈。3.每个割点可能属于多个连通分量。G++ AC,哪位大神帮忙改成C++ ACView Code #include<stdio.h>#include<string.h>#include<algorithm>#include<vector>using namespace std;#define maxn 1010#define maxm 1000009bool map[maxn][maxn];int min(int a, int b) 阅读全文
posted @ 2012-11-05 16:22 To be an ACMan 阅读(224) 评论(0) 推荐(0)
摘要:注意:去掉反向边View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 10004#define maxm 100055#define inf 1000000000int min(int a, int b){ return a < b ? a : b;}struct E{ int v, next;}edge[maxm<<1];int head[maxn], tot;int n, m;void add(in 阅读全文
posted @ 2012-11-01 20:57 To be an ACMan 阅读(177) 评论(0) 推荐(0)
摘要:View Code #include<stdio.h>#include<string.h>#define maxn 110#define maxm maxn * maxn#define inf 1000000000int min(int a, int b){ return a < b ? a : b;}struct E{ int v, next;}edge[maxm<<1];int head[maxn], tot;int n, m;void add(int s, int t){ edge[tot].v = t; edge[tot].next = hea 阅读全文
posted @ 2012-11-01 20:49 To be an ACMan 阅读(154) 评论(0) 推荐(0)