上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 85 下一页
  2012年9月3日
摘要: HDU_2933 具体的思路可以参考《浅谈数形结合思想在信息学竞赛中的应用》。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 100010typedef long long LL;int N, K, A[MAXD], q[MAXD];void cin(int &x){ char ch; while(ch = getchar(), ch < '0' || ch > '9'); x = ch - '0'; wh 阅读全文
posted @ 2012-09-03 15:01 Staginner 阅读(285) 评论(0) 推荐(0) 编辑
摘要: HDU_3053 这个题目和POJ_1160几乎是一样的,具体的一些思路可以参考我的POJ_1160的题解:http://www.cnblogs.com/staginner/archive/2012/03/12/2391925.html?updated=1。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 3010#define INF 0x3f3f3f3fint N, P, f[MAXD][MAXD], K[MAXD][MAXD], A[MAXD], a[MAXD];voi 阅读全文
posted @ 2012-09-03 10:47 Staginner 阅读(204) 评论(0) 推荐(0) 编辑
摘要: HDU_3452 设树整体的根为T,对于以i为根节点的一棵子树,f[i]表示断开这棵树中的叶子和T的联系所需的最小代价。要断开i这棵子树中的叶子和T的联系,那么就是要断开i的所有孩子为根的子树中的叶子和T的联系。这样对于i的任意一个孩子j,要么j的叶子本来就和i断开的联系,要么就断开i->j这条边,依据这一点就可以用dp自底向上求得每个f[i]了,f[T]即为最后结果。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 1010#define MAXM 2010#defi 阅读全文
posted @ 2012-09-03 08:24 Staginner 阅读(287) 评论(0) 推荐(0) 编辑
  2012年9月2日
摘要: HDU_2376 对于任意一棵子树来讲,以根节点为深度最浅的点的路径一共有两类,一类是以根节点为端点的路径,另一类是过根节点但端点分别在两棵子树中的路径。然后将无根树转化为有根树后dfs时计算出上面两类路径的长度即可。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define MAXD 10010#define MAXM 20010typedef long long LL;LL f[MAXD], ANS;int N, first[MAXD], size[ 阅读全文
posted @ 2012-09-02 23:48 Staginner 阅读(190) 评论(0) 推荐(0) 编辑
摘要: HDU_2577 这个题目要注意如果Caps Lock打开时再按Shift打出的字符就是小写的。 我们可以用f[i][j]表示打完第i个字符时大写锁的状态为j(j=1表示大写锁打开)时所需最少的按键数,那么最终的结果就是f[N][0]。 在递推时可以考虑当前字符状态是否和j为同一状态,如果同状态,那么f[i][j]=std::min(f[i-1][j],f[i-1][j^1]+1)+1,表示要么从前面相同的状态直接过度过来,要么从前面不同的状态按一下Caps Lock过度过来,最后按一下字符键将字符打印出来,如果当前字符和j为不同状态,那么f[i][j]=std::min(f[i-1][... 阅读全文
posted @ 2012-09-02 22:33 Staginner 阅读(217) 评论(0) 推荐(0) 编辑
摘要: HDU_3632 抽象出0和N+1两个点,但它们赢不了任何一个人,然后用f[i][j]表示i、j可以会师(也即若干场比赛后可以变成相邻的两个人),这样如果f[i][j]可能为1,那么就必须存在一个k(i<k<j)满足f[i][k]=1、f[k][j]=1且i和j两人中至少有一人能够打败k。 最后如果f[0][i]=1且f[i][N+1]=1就说明i可以留到最后。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210int N, g[MAXD][MAXD], f[ 阅读全文
posted @ 2012-09-02 19:22 Staginner 阅读(206) 评论(0) 推荐(0) 编辑
摘要: HDU_3651 首先可以把1~0映射成0~9,这样更好处理一些。接着我们可以用f[d][x][y]表示已经输入了d个数、左手指在x、右手指在y这种情况所需要的最少秒数,一开始d[0][4][5]=0,接着我们可以把每个状态看成一个点,每个点都和可能转移到的状态连有一条权值为1的边,抽象成这样的模型之后就可以通过dij求最短路来得到答案了。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define MAXD 110#define INF 0x3f3f3f 阅读全文
posted @ 2012-09-02 17:54 Staginner 阅读(253) 评论(0) 推荐(0) 编辑
  2012年9月1日
摘要: HDU_2518 这个题目明显就是裸的Dancing Links,只不过由于情况实在太多了,写起来超级繁琐,而且写完之后几乎不可能在规定时间内出解(大家交的都是0ms的,估计都是打表交的),于是就只好把6种情况的结果存到数组里直接输出了。View Code // 打表程序#include<stdio.h>#include<string.h>#define MAXN 5810#define MAXM 80#define MAXD 35510#define HASH 100007#define SIZE 100010#define INF 0x3f3f3f3ftypedef 阅读全文
posted @ 2012-09-01 08:38 Staginner 阅读(223) 评论(0) 推荐(0) 编辑
  2012年8月31日
摘要: HDU_2873 由于每次炸弹爆炸后剩下生成的炸弹都会往角上缩,因此如果把炸弹的状态看成一个节点的话实际上这是一个有向无环图的公平组合游戏,所以可以用SG函数的理论来求解。由于每个炸弹都是独立的,可以把每个炸弹的SG函数值通过记忆化搜索计算出来,然后异或到一起就是整个局面的SG函数值。#include<stdio.h>#include<string.h>#define MAXN 60#define MAXD 2510int N, M, sg[MAXN][MAXN];char b[MAXN];void prep(){ int i; memset(sg, -1, sizeo 阅读全文
posted @ 2012-08-31 22:28 Staginner 阅读(442) 评论(0) 推荐(0) 编辑
摘要: ZOJ_3209 精确覆盖问题,用Dancing Links直接求解即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 510#define MAXM 910#define MAXD 460010#define INF 0x3f3f3f3fint N, M, P, size, U[MAXD], D[MAXD], L[MAXD], R[MAXD], C[MAXD];int S[MAXM], H[MAXN], ANS, vis[MAXM];void prep(int n, i 阅读全文
posted @ 2012-08-31 17:55 Staginner 阅读(230) 评论(0) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 85 下一页