搜索
文章平均质量分 74
yrleep
大学毕业不久,ios游戏自由开发者。
展开
-
poj 1020 搜索
刚开始想到的是枚举蛋糕的位置,从大蛋糕开始放,一定要左边,上边能贴住边界或别的蛋糕才认为是合法的位置,认为其与的方法比它差,wa了,这个贪心不是正确的然后改成,只要有一边能贴住就认为是合法的位置,t了看了其他人的方法,是找一个位置,然后枚举蛋糕往里边放,从左往右,从上往下放,这里很重要的一点是记录蛋糕的方法,用一维的数组表示这一列放了几个格即可,但是还是t还有一个问题,这样记录的话有可能出原创 2013-04-14 19:37:57 · 553 阅读 · 0 评论 -
poj 2454 Jersey Politics dfs
这个题目第一步还是比较明显的,先把最小的n个值去掉,剩下的问题就是能不能把数据分成两半,使得每一半和都大于n*500,这个刚开始考虑了下dp的做法,但是复杂度不满足要求。那么能想到的就是搜索了,实际上这个搜索的上限还是比较高的,就只能依靠良好的剪枝试试了,两个情况,剩下的值全部选最大还小于要求,剩下的值全部选最小另一半还小于要求。0ms ac#include #include #inc原创 2013-09-03 23:19:19 · 1024 阅读 · 0 评论 -
hdu 4712 Hamming Distance bfs
我的做法,多次宽搜,因为后面的搜索扩展的节点会比较少,所以复杂度还是不需要太悲观的,然后加上一开始对答案的估计,用估计值来剪枝,就可以ac了。#include #include #include #include using namespace std;char a[11];int key[111111];int hash[1111111];int que[2111111];原创 2013-09-08 21:56:30 · 992 阅读 · 0 评论 -
poj 3172 Scales 搜索
其实这个题目要是注意到了题目的一点关键性的描述就会变得很简单,题意是给出的砝码是至少是前两个的和的,有了这一点,那么砝码的数量应该就在几十左右,这样的话适当剪枝的搜索是应该可以过的。#include #include #include using namespace std;const int maxn=1e3+9;unsigned int a[maxn];int n,c;lon原创 2013-08-29 17:41:18 · 1025 阅读 · 0 评论 -
poj 2133 Cow Imposters
这个题目需要注意的是一定要操作,即初始串及时跟目标串相同,仍然需要操作。比较简单的搜索,应该很容易看出来,一次bfs搜出所有结果即可。#include #include #include using namespace std;char a[20];int n,m;int goal;int dp[70000],turn[111];int que[70000];bool t原创 2013-08-28 01:03:08 · 1210 阅读 · 0 评论 -
poj 1184
经典的宽搜题目,感觉最好的办法应该是双向广搜。不过用简单的启发式搜索可以飘过。#include #include #include #include #include using namespace std;int a,b;char ans[1111111][7];int inf[7]={1,1,10,100,1000,10000,100000};struct D{原创 2013-08-09 16:01:26 · 924 阅读 · 0 评论 -
poj 1945 Power Hungry Cows 启发式搜索
这个题目用了启发式搜索来做,hash判重,优先队列储存节点。启发式函数就是大的数字x*2^k>n,即为k。x为节点中较大值,y为节点中较小值然后后面就是一些剪枝了,当x>2*n不能得出最优解。当y==0,不能得出最优解。当x==y,不能得出最优解。还有一个比较关键的剪枝,gcd(x,y)不能整除n时,得不出结果。#include#include#include#原创 2013-04-14 19:40:50 · 1408 阅读 · 0 评论 -
poj 1950 Desser dfs
这个题目很简单,就是一个简单的dfs。#include #include #include using namespace std;char a[22];int n,ans;void prin(){ for(inti=1;i { printf("%d %c ",i,a[i+1]); }原创 2013-04-14 19:40:59 · 598 阅读 · 0 评论 -
poj Light Up dfs
这个题目说两种思路第一种:也是比较多人采用的,一个个格子顺序搜素,放灯不放灯两种状态,加一个剪枝,如果当前点为墙,且其上面为黑暗的地方,剪枝。思路非常清晰。第二种:也是本菜采用的,效果很差,先找有限制的障碍点,其周围挨个放灯,每次从头到尾扫描找这样的点。如果没有这样的点,随便找一个黑暗的点,其x,y轴上必然还要放一个灯,枚举这些点放灯。400+ms飘过。。。#include#incl原创 2013-04-14 19:39:27 · 498 阅读 · 0 评论 -
poj 1324 Holedox Moving 宽搜
一道搜索的题目,用了状态压缩,把蛇的身体后面的部分与前一部分的相对位置存储起来,加上头的位置。共有20*20*4^7个状态然后就是广搜的过程了,先压缩,进队列,解压,然后拓展节点。遇到终点退出。#include#include#includeusing namespace std;const int inf=99999999;int n,m,l;int ans[21][21][原创 2013-04-14 19:39:22 · 534 阅读 · 0 评论 -
poj 1655 balancing act dfs
此题网上说是树形dp但是貌似也没什么dp的思想,就是一个简单的统计节点的过程,统计每个儿子的儿子数,总结点数减去本身的儿子数,取最大值,就是题目所求 #include #include#includeusing namespace std;const int maxn=20011,inf=9999999;int n;struct{ intto,next;}e[ma原创 2013-04-14 19:38:34 · 457 阅读 · 0 评论 -
poj 1980 Unit Fraction Partition…
这个用了double来判断相等与否,精度不太好把握,而且需要注意的东西也多一些 搜索顺下,t从小到大剪枝 tmp>sum tmp为接下来所能选择的最大的分母,sum为剩下的值 (1/t)*n 当乘积大于a时 退出 #include #include#include#includeusing namespace std;int ans;原创 2013-04-14 19:38:10 · 725 阅读 · 0 评论 -
poj 1426 宽搜
想明白的话就是一个简单的宽搜按余数搜索,余数的情况只有200种,转移的方式是每次在数列后面加1或者0#include #include#includeusing namespace std;int ans[201][110],lon[201],text[201];int que[1000001];int main(){ int n; while(scanf("%d原创 2013-04-14 19:38:04 · 463 阅读 · 0 评论 -
poj prime path 启发式搜索
这个题目可以比较容易的设计一个启发式函数,而且该函数的效果也比较好不过一般的启发式搜索用的是bfs,然后要用到优先队列,还得判重虽然不困难,但也麻烦尝试了下用迭代加深的方式来做启发式搜索方法是下界已经超过的点吧不予扩展,效果不错缺点是产生了重复的点比较多,而且也牺牲了时间在重复搜索上优点:实现简单,节省空间#include #include#includeusing names原创 2013-04-14 19:38:12 · 752 阅读 · 0 评论 -
poj 1190 生日蛋糕 剪枝dfs
两个可行性剪枝 if(i*i*j*m int tmp=0,p=1; for(int k=1;k { tmp+=p*p*p; p++; } if(tmp>n) con原创 2013-04-14 19:38:08 · 477 阅读 · 0 评论 -
poj 2531 暴力dfs
直接dfs过的没技术含量。。 #include#include#includeusing namespace std;int a[21][21],q1[21],lon1,q2[21],lon2;int ans=0;int dfs(int t,int n){ if(t>n) { int sum=0; for(int i=1;i原创 2013-04-14 19:38:06 · 570 阅读 · 0 评论 -
poj 3278 宽搜
简单宽搜,点从0开始这点让我wa了两次 #include#include#includeusing namespace std;const int maxn=100001,inf=9999999;int ans[maxn];int que[1000001],front,end,text[maxn];int main(){ intn,k; scanf("%d%原创 2013-04-14 19:38:02 · 561 阅读 · 0 评论 -
poj 2488
简单dfs#include #include int n,m,time,ture;int a[9][9];int make(int t,int s){ if(ture) return(0); if(t>=1&&t=1&&s { a[t][s]=++time; if(time==n*m) {原创 2013-04-14 19:38:00 · 414 阅读 · 0 评论 -
csdn 4090 GemAnd Prince
写了个最朴素的dfs#include #include #include using namespace std;int a[10][10],sum[10],ans;int n,m,k;int quex[111],quey[111],front,end;bool chk(int t,int s,int use[10][10]){ int ret=0; int x原创 2013-11-25 21:15:11 · 787 阅读 · 0 评论