2012年4月21日
摘要: SGU_225由于在dp的时候需要记录上面两行放置马的状态,以及马的数量,这样状态数就相当多了,直接交写完的dp就TLE了。暂时没有想到好的办法,所以拿自己dp的程序打了个表交上去AC了。// 注意:这个程序是用来打表的,并不是可以直接提交的程序。#include<stdio.h>#include<string.h>#define MAXD 20#define HASH 100007#define SIZE 2000010int N, K, ucode[MAXD], dcode[MAXD], ncode[MAXD], num;struct Hashmap{ int he 阅读全文
posted @ 2012-04-21 20:29 Staginner 阅读(350) 评论(0) 推荐(0) 编辑
摘要: SGU_223最近刚学了插头dp,所以就用插头dp那个模式写了这个题。如果逐格递推的话实际上只有这个格子左边、左上方、上方、右上方的格子会影响当前这个格子是否能够放king,所以在记录状态的时候可以把轮廓线上有无king作为一个状态,同时单记录轮廓线上的king没办法知道最后有多少个king,所以再在状态中留出7个二进制位记录一下已经放了几个king即可。#include<stdio.h>#include<string.h>#define HASH 30007#define SIZE 1000010#define MAXD 15int N, K, code[MAXD], 阅读全文
posted @ 2012-04-21 17:35 Staginner 阅读(292) 评论(0) 推荐(0) 编辑
摘要: SGU_222最近刚学了插头dp,所以就用插头dp那个模式写了这个题。可以用f[i][j][st]表示推到第i行第j列时,行和列上rook的状态为st时方案的种数。#include<stdio.h>#include<string.h>#define HASH 30007#define SIZE 1000010int N, K, rst, cst;struct Hashmap{ int head[HASH], next[SIZE], state[SIZE], size; long long f[SIZE]; void init() { memset(head... 阅读全文
posted @ 2012-04-21 16:36 Staginner 阅读(316) 评论(0) 推荐(0) 编辑
摘要: ZOJ_3213 我是用最小表示法写的这个插头dp,相比于回路问题来讲,变简单的地方是不用考虑合并两个相同的连通分量这一情况了,变复杂的地方就是多出了两个个独立插头。 为了搞定独立插头的问题,我在编码的时候额外加了一个状态num,表示当前已经使用的独立插头的数目,这样只要保证num不超过2而且不合并相同的连通分量就能保证最后是一条简单路径。 在dp的时候因为多了独立插头,所以分的情况就更多一些。#include<stdio.h>#include<string.h>#define MAXD 15#define HASH 30007#define SIZE 1000010i 阅读全文
posted @ 2012-04-21 15:56 Staginner 阅读(347) 评论(0) 推荐(0) 编辑
摘要: FZU_1977 对于必须要走的点,那么在那个点就一定要有插头。而对于不必走的点,如果dp到该点时没有插头,那么既可以在这个点放两个插头开辟一个新的连通分量,也可以不放插头,相当于不经过这个点。 此外由于回头只能有一条,而形成回路的最后一个点又是不确定的,所以可以再额外记录一下当前是否已经形成了回路,这样如果已经形成了回路而后面又遇到了插头或者必须要走的点,那么这个方案自然就是不合法的。#include<stdio.h>#include<string.h>#define MAXD 15#define HASH 30007#define SIZE 500010int N, 阅读全文
posted @ 2012-04-21 00:19 Staginner 阅读(445) 评论(0) 推荐(0) 编辑