摘要: 题目大意:输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。这道题目要转化啊……c[i.j]表示将数字i拆成j个数(易知j<=i)那么c[i-j,j]表示的则是从比i小j的数拆分成j个数,将这j个数每个都+1就转移到了c[i,j],另外一种是c[i-1,j-1]添加一个新的数字1也可以转移到当前状态。program Neayo;const inf='number.in'; ouf='number.out';var i,j,k,n:longint; ans:int64; f:array[0..501,0... 阅读全文
posted @ 2012-10-14 20:38 neayo 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给你n个人以及他们之间的关系,求最多能有多少个互相认识的人以及最多人数的方案数。其实差不多是裸搜,用一个二进制数储存关系,加入的时候and一下就行。但是直接搜的话会有很多重复状态,考虑一种搜索方式绝对不会出现重复状态。于是我们规定外层用一种搜索顺序,内层的搜索顺序与外层相反,这样就保证内层搜的时候可以利用原来的结果。并且新加入一个节点的时候它只能去找那些以前已经搜索过的建环,这样可以保证没有重复的环。这里有个很重要的剪枝,当搜到一个节点的时候,如果当前已经在环里的人数加上这个节点之后能加入的最大人数还小于当前的max,那么就可以直接退出这一层搜索。这个剪枝对于这道题真的非常强……pr 阅读全文
posted @ 2012-10-14 20:28 neayo 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 吐槽这道题。。。好烦燥。。。goto在pascal里面超时了啊!!!goto你妹啊。。。题目大意:这个游戏是两个人轮流在4*4的格子中放棋子,一个人放满了一行或一列或一个对角线就算赢。现在,小秋秋用X先手,已经下过许多步了。他想知道自己现在是否有必胜策略,以及最小的字典序走法。完全的裸搜,但是要判断它是不是必胜策略的话,不管别人怎么走你都要赢才行。program Neayo;uses sysutils;const inf='chess.in'; ouf='chess.out';var f:array[1..4,1..4]of longint; ... 阅读全文
posted @ 2012-10-14 20:08 neayo 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 题目大意:一个无限大的平面,给你N种行走方式,从原点出发,能不能走遍整个平面。其实只要能走到(-1,0)(0,-1)(1,0)(0,1)四个点就可以了,可以推测只要在(-100,-100)(100,100)这个正方形里面走就可以了(为什么啊。。。)program neayo;var i,j,k,n,xx,yy,top,closed:longint; x,y:array[0..11]of longint; qx,qy:array[0..50000]of longint; h:array[-100..100,-100..100]of boolean;begin assign... 阅读全文
posted @ 2012-10-14 19:39 neayo 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给你一个n*m的矩阵,0代表路,1代表墙,给出起点和中点,求最短距离。双向广搜的一个显著特点即是知道初始状态和目标状态,虽然说这道题可能还体现不出双向广搜的优势……具体方法可以望文生义,就是要加一个标记记录这个状态是从起点还是从终点转过来的。 1 program Neayo; 2 const 3 inf='maze.in'; 4 ouf='maze.out'; 5 f:array[1..4,1..2]of longint=((0,-1),(-1,0),(1,0),(0,1)); 6 var 7 i,j,k,n,m:lon... 阅读全文
posted @ 2012-10-14 19:23 neayo 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 题目大意:对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数2,4,6等都是反质数。现在给定一个数N,求出不超过N的最大的反质数。其实这道题就是根据每个整数都可以拆分成x1p1x2p2...xnpn,(xi为质数)且X1>X2>...Xn则有P1>P2>...Pn,按照质数顺序搜索即可。program Neayo;const inf='input.txt'; ouf='output.txt'; g:array[1.. 阅读全文
posted @ 2012-10-14 19:09 neayo 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 题目大意:给你一些操作(操作和串的长度一样,操作的每一位对应串的每一位),一些串和它的目标串,求出把它变换成目标串的最小操作次数。串的长度len<=20,操作方式m<=50,n<=4考虑到直接枚举所有操作并且每次对每一位进行操作会很慢,又都是01串,很容易想到位运算。把每一个串都看成一个二进制数,修改为1等价于or 1,修改为0为and 0,取反为xor 1。所以建立三个数组,c0,c1,cqf表示三种运算,一个操作则对应三个二进制数。这样状态就可以O(1)的转移。program Neayo;const inf='quantum.in'; ouf='q 阅读全文
posted @ 2012-10-12 15:26 neayo 阅读(680) 评论(0) 推荐(0) 编辑
摘要: 题目大意:若两个格子有公共顶点,那么他们就是相邻的格子。(所以与(i,j)相邻的格子有(i−1, j−1),(i−1,j),(i−1,j+1),(i,j−1),(i,j+1),(i+1,j−1),(i+1,j),(i+1,j+1))。我们定义一个格子的集合S为山峰(山谷)当且仅当:1.S的所有格子都有相同的高度。2.S的所有格子都联通3.对于s属于S,与s相邻的s’不属于S。都有ws>ws’(山峰),或者ws<ws’(山谷)给定一个图,求所有的山峰和山谷。注意,有的格子可能既不是山峰也不是山谷,当所有格子都等高的时候,它既是山峰也是山谷。直接裸搜,枚举一个未被访问的结点搜索所有它能 阅读全文
posted @ 2012-10-12 14:33 neayo 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 经典问题题目大意:对于一个n*n的矩阵,每条横线竖线斜线上都只能放一个皇后,求方案。用搜索即可,但是如果一个格子一个格子地枚举肯定会超时,所以考虑枚举每一行放的情况,但是要注意判断斜线上合不合法的情况,下面就是一种很好的方法。可知对于一个矩阵有如下特性,每条红色线上i-j的值相同,每条蓝线上i+j的值相同,并且它们的i+j或i-j的值都是不重复的。那么设置一个数组f1记录蓝色斜线,数组f2记录红色斜线,放第i行第j个的时候直接判断f1[i+j]和f2[i-j]有没有放。program Neayo;const inf='queen.in'; ouf='queen.ou.. 阅读全文
posted @ 2012-10-12 11:14 neayo 阅读(158) 评论(0) 推荐(0) 编辑