摘要: 天啊,漏了一个条件,搞了半天,默认从第0个problem 开始做起,唉,我枚举所有的问题了……………………在DFS过程中,只要把最大深度记录下来即可,不需要其他#include<iostream>#include<string>using namespace std;int n,map[15][15],ans;bool vis[15];void dfs(int i,int j,int deep){ if(deep>ans)ans=deep; for(int k=1;k<=n;k++) { if(vis[k]||k==j) continue; if(map[i 阅读全文
posted @ 2011-08-11 23:58 枕边梦 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 这题目,唉,一开始以为很简单的,就是枚举每一个KFC到M和Y的距离,求出最短的,结果TLE了之后,突然想到了双向搜索,天呐,又郁闷了很久,从来都没写过,一时不只从何下手,而且,不知道搜索时的停止条件该如果设置,结果就……回到一开始最不想做的,就是分别用调用俩次BFS,算出M和Y到每一个KFC的最短距离,再累加求最短即可这时候要注意,BFS退出的条件是遍历完所有的点,所以遇到‘@’时,把相应时间累加之后,还是要继续搜另外,有一点也是十分重要的 ,就是未必每一个KFC都是可达的,所以要多加一步判断………唉………#include<iostream>#include<string&g 阅读全文
posted @ 2011-08-11 22:53 枕边梦 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 做了这么久的搜索,终于还是碰到了N皇后问题,之前一直都不敢去触碰,今天还是无奈的做了我的代码比较乱,也比较慢,看下大牛的代码吧,感觉好精炼呀,而且效率很高的说map[],下标表示所在行,值表示所在列哈,判断是否在同一对角线上居然是这么判断的,好神奇要事先打表View Code #include<iostream> #include<string>using namespace std;int n,map[20],des[20],cnt,a[11]; void DFS( int num ) { if( num == n + 1 ) { ++cnt... 阅读全文
posted @ 2011-08-11 20:46 枕边梦 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 给了一个8*8的地图,时间要求却是5000ms ,似乎就是要遍历整个地图,枚举设置的封锁区域一开始是想把所有可行的路径找出来,再看一下重复路径,判断应该设置多少个封锁区域,但是一旦设置了一个封锁区域,就又出现了不同的路径出来,这样,就跟枚举有何差别呢?思路(大牛的):封锁出口或者入口周围的格子.最多需要4个封锁点.所以我们可以采取这样的策略:1.寻找一条盗贼的可行路线,如果没有,返回0.2.计算封锁出口和入口四周需要的封锁点数量,取小的一个,假设是k,k <=43.从少到多,遍历所有封锁点个数小于k的方案,验证是否是一条有效的覆盖方案(可以通过是否阻止了1中的盗贼线路进行快速验证).如果 阅读全文
posted @ 2011-08-11 17:04 枕边梦 阅读(454) 评论(0) 推荐(0) 编辑
摘要: 这题目跟之前的连连看还有hdu1072 都很像,就是路径受转弯次数的限制,这时vis[][]数组并非用来记录一个点是否已被访问过,而是记录经过该点的最少转弯次数,若经过该点存在更少的转弯次数的路径,则该点可以再次入队看代码吧#include<iostream>#include<queue>using namespace std;char map[101][101];int n,m,T,ei,ej,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};int vis[101][101];struct node{ int x,y,di,turn;};n 阅读全文
posted @ 2011-08-11 09:43 枕边梦 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 这两天被Dilworth、链和反链搞到头昏脑胀,终于有点眉目,现在来总结一下。Dilworth定理说的是:对于一个偏序集,其最少链划分数等于其最长反链的长度。Dilworth定理的对偶定理说的是:对于一个偏序集,其最少反链划分数等于其最长链的长度。Dilworth定理先不证,有空再不上来,其对偶定理证明如下:设一个偏序集S的最少反链划分数是p,最长链长度是r。1.先证p≥r。这是显然的,因为最长链长度是r,r个元素中的任意两个都可以比较,因此它们必定两两属于不同的反链,因此反链个数≥r,即p≥r。2.再证r≥p。设X1=S。找出X1的所有极小元组成集合Z1,将其从X1删之,得到X2,再找出X2 阅读全文
posted @ 2011-08-11 01:12 枕边梦 阅读(1360) 评论(0) 推荐(1) 编辑
摘要: 这俩道题目的代码基本和pku 3636一样的主要的区别就是第二个元素排序时同样也是递增排序,因为第一个元素相同时,第二个元素按递增顺序可以全部加入,不用重新再增加桶所以后面的一个判断条件也要将等号去掉pku1065#include<iostream>#include<algorithm>using namespace std;struct Node{ int h,w; bool operator<(Node a){ if(a.w==w) return h<a.h; return w<a.w; }}ele[5010];int a[5010];int ma 阅读全文
posted @ 2011-08-11 01:09 枕边梦 阅读(142) 评论(0) 推荐(0) 编辑
摘要: 题型: 贪心思路: 由于一个盒子在考虑放入另一个盒子之前,要考虑两个因素,宽和高,如果我们能够消除一个因素,就在一维的条件下考虑会简单些。怎么才能降低维数呢。因为只有w小于另一个时才能才能考虑是否能放,所以我们就把w从小到大排序,这样大体盒子的先后顺序就有了,我们在比较的时候就不需要考虑宽了,因为只有后边的盒子才能容纳前边的盒子先不考虑w和h相同的情况,排好序后,从第一个盒子开始遍历,第一个盒子不能容纳其他任何的盒子(宽最小),所以直接做为一个桶了。然后第二个,看他能不能容纳第一个,只需考虑h满足要求与否。然后第三个,问题来了,它既能容纳第一个,又能容纳第二个,选择哪一个,贪心就在这,它能刚好 阅读全文
posted @ 2011-08-11 00:19 枕边梦 阅读(305) 评论(0) 推荐(0) 编辑