MY*****

2011年10月20日

poj 2112

摘要: 分析:二分图多重匹配。这个东西是第一次遇到,一直以为多重匹配之类的只能用最大流去解决(这个应该是最大流的基本功能),其实稍微修改一下匈牙利算法就可以了。把next设置成边表类型的,往里头放点,超过limit之后再进行find(next[i,k])进行增广。思路非常简单,二分答案判定即可。代码:var b:array[0..250,0..15] of longint; v:array[0..250] of boolean; a:array[0..250,0..250] of longint; i,j,k,m,n,limit,l,r,mid,ans:longint;function fin... 阅读全文

posted @ 2011-10-20 07:54 reflec94 阅读(232) 评论(0) 推荐(0) 编辑

poj 3460 bookstore

摘要: 分析:第二道IDA*题目。那个估价函数确实不好想,不过做了这道题目之后应该对IDA*的应用范围有了更为明确地了解。IDA*应用于搜索树的深度比较小,但是每一层扩展出来的节点呈指数增长,这样的话BFS空间上受不了,DFS时间上受不了。于是想到用迭代加深搜索,即ID搜索。但是普通的ID搜索并不能快很多,于是有了IDA*搜索。这当中最难的就是A*中的估价函数的设计,这一点需要充分利用题目中的条件,保证估价函数小于等于实际最优值,而且要尽量接近最优值。这样的话会快很多。代码:type arr=array[0..15] of integer;var a,b:arr; i,j,k,n,t,step,... 阅读全文

posted @ 2011-10-20 07:54 reflec94 阅读(321) 评论(0) 推荐(0) 编辑

poj 1077 eight

摘要: 分析:经典的八数码问题,这里用的是heap+A*。A*很明显是用那个经典的A*,heap的维护和k短路非常像。第二个简单A*代码(模仿某人的):const nx:array[1..9] of integer=(1,1,1,2,2,2,3,3,3); ny:array[1..9] of integer=(1,2,3,1,2,3,1,2,3); ji:array[0..9] of longint=(1,1,2,6,24,120,720,5040,40320,362880);type arr=array[1..9] of integer;var q:array[0..10000] of i... 阅读全文

posted @ 2011-10-20 07:53 reflec94 阅读(256) 评论(0) 推荐(0) 编辑

poj 1190 noi99 生日蛋糕

摘要: 分析:经典剪枝。我的稍微加了点剪枝的搜索连10000,3,这个数据都出不来结果,主要原因在于剪枝减去的太少了,而且从小到大搜索剪枝效果非常不好。后来参考了一下一个c++程序,非常快,16ms。首先根据V=H*R*R,S=2*H*R可知2*V/S等于面积,这一面积是可能的最小面积。加上这个剪枝后非常快。代码1:var ans,maxh,maxr,n,m:longint;procedure dfs(v,h,r,deep,s:longint);var maxhh,maxvv,i,j:longint;begin if v<r*r*h*(m-deep+1) then exit; if v<0 阅读全文

posted @ 2011-10-20 07:52 reflec94 阅读(411) 评论(0) 推荐(0) 编辑

poj 2044 weather forcast

摘要: 分析:非常好的记忆化搜索题目。非常经典的地方就是巧妙地记录了是否有地方连续7天没有下雨,直接用四个顶点表示是否有没有下雨的地方,用一个六维的数组进行判重,并且用到了位运算和二进制进行状态表示。非常好。代码:const nx:array[1..9] of integer=(0,-1,-2,0,0,1,2,0,0); ny:array[1..9] of integer=(0,0,0,-1,-2,0,0,1,2);type ji=record a,b,c,d:longint;end;var d:array[0..366] of longint; i,j,k,n:longint; now... 阅读全文

posted @ 2011-10-20 07:52 reflec94 阅读(292) 评论(0) 推荐(0) 编辑

poj 3322 Bloxorz I

摘要: 基础的BFS题目,但是发现自己好久没有做过搜索题了,这道题做的很不爽,尤其是方向常量的处理,完全抄袭了他人的。代码:const nx:array[0..2,1..4] of integer=((1,-2,0,0),(1,-1,0,0),(0,0,-1,2)); ny:array[0..2,1..4] of integer=((0,0,1,-2),(0,0,-1,2),(1,-1,0,0)); ns:array[0..2,1..4] of integer=((2,2,1,1),(1,1,0,0),(2,2,0,0));type ji=record x,y,s,w:longint;end... 阅读全文

posted @ 2011-10-20 07:51 reflec94 阅读(216) 评论(0) 推荐(0) 编辑

poj 2688 Cleaning Robot

摘要: 分析:状态压缩的BFS或者dfs状态+最短路。前者就是类似于拯救大兵瑞恩的方法,后者非常经典,dfs全排列枚举然后根据最短路相加。WA三次+TLE一次+AC。代码:const nx:array[1..4] of integer=(0,0,1,-1); ny:array[1..4] of integer=(1,-1,0,0);type ji=record x,y,s,step:longint;end;var v:array[0..1027,0..24,0..24] of boolean; q:array[0..1000000] of ji; b:array[0..25,0..25]... 阅读全文

posted @ 2011-10-20 07:50 reflec94 阅读(255) 评论(0) 推荐(0) 编辑

poj 2676 soduku

摘要: 分析:直接dfs即可,没什么。只不过从1,1开始搜时间是1000++,从n,n开始搜时间是16ms。差距。所以最好的办法就是随机搜索。poj上另外的两个soduku就不是简单的搜索能通过的了,3074的很多数据单个都不能很快出结果,对3076更慢,只能用dancing links来优化或者彻底改变搜索方式+加上强剪枝。代码:var z,h,l:array[1..9,1..9] of boolean; a:array[1..9,1..9] of integer; b:array[1..9,1..9] of integer; t,i,j,k:longint; ch:char; vv:b... 阅读全文

posted @ 2011-10-20 07:50 reflec94 阅读(296) 评论(0) 推荐(0) 编辑

poj 3709 K-Anonymous Sequence

摘要: 终于把最后一道优化DP的题目做了,斜率优化之前掌握的不是非常熟练呀。朴素方程:f[i]=min{f[k]+s[i]-s[k]-a[k+1]*(i-k)}。就这么一个朴素方程的化简,搞了很久。把减号写成加号导致化简完全错误,纠结于直接用double还是用int64的x和y,后来有纠结于≤和≥的问题。这才完全搞定斜率优化。不错的题目。代码:var q,f,s,a:array[0..500002] of int64; head,tail,n,m,i,j,t:longint; k,xx,yy,zz:int64;function y(k,j:longint):int64;begin exit(f... 阅读全文

posted @ 2011-10-20 07:49 reflec94 阅读(254) 评论(0) 推荐(0) 编辑

poj 3017 cut the sequence

摘要: 分析:不好理解,大体上知道了优化的方向,但是需要单调队列和平衡树(或堆)来维护。比较难以理解。f[i]=min{f[k]+max{a[k+1],.....,a[i]}}.n2的枚举没有问题,优化势在必行。我们另A[I,J]表示i到j的最大值,那么如果A[i+1,j]=A[i+2,j],那么f[i]+A[i+1,j]<f[i+1]+A[i+2,j],所以很显然f[i]=min{f[k]+A[k+1,i]}有用的K值都是满足某段区间的最大值。如果用单调队列维护a[i]使队列中的元素a值单调递减,那么显然可以用于更新的就是a[q[i]]+f[q[i-1]],但是与其他题目不同的是队首元素并不是 阅读全文

posted @ 2011-10-20 07:49 reflec94 阅读(435) 评论(1) 推荐(0) 编辑

poj 1180 IOI202 经典DP任务安排

摘要: 朴素方程:f[i,j]=min{f[k,j-1]+(tx[i]-tx[j])*(t[i]+j*s)} ①非常经典和常用的优化就是根据每一次启动和分段对后面产生影响,可以优化为: f[i]=min{f[k]+(t[i]-t[j]+s)*(tx[i]-tx[k])+s*(tx[n]-tx[i])} ②而更进一步可以写成更方便的一个方程:f[i]=min{f[k]+(tx[n]-tx[k])*(s+t[i]-t[k])} ③这个似乎更能充分的应用对后面的影响这一特点。根据③这个方程,我们可以进行更强大的优化:斜率优化。为了... 阅读全文

posted @ 2011-10-20 07:48 reflec94 阅读(373) 评论(0) 推荐(0) 编辑

poj 1821 fence

摘要: 朴素的也不好写: for i:=0 to n do f[i,0]:=0; for i:=1 to n do begin for j:=1 to a[i].s-1 do f[i,j]:=max(f[i-1,j],f[i,j-1]); for j:=a[i].s to a[i].s+a[i].l-1 do begin if j>l then break; f[i,j]:=max(f[i,j-1],f[i-1,j]); for k:=0 to a[i].s do ... 阅读全文

posted @ 2011-10-20 07:47 reflec94 阅读(272) 评论(0) 推荐(0) 编辑

poj 2823 window

摘要: 分析:经典的队列应用,实现N的最大最小查找。var a,q:array[0..1000000] of longint; i,j,head,tail,n,m:longint;begin readln(n,m); for i:=1 to n do read(a[i]); head:=1; tail:=1; q[1]:=1; for i:=2 to m-1 do begin while (head<=tail)and(a[q[tail]]>=a[i]) do dec(tail); inc(tail); q[tail]:=i; end; for ... 阅读全文

posted @ 2011-10-20 07:46 reflec94 阅读(966) 评论(0) 推荐(0) 编辑

SCOI2010 股票交易

摘要: 分析:非常好的动态规划题目,优化的思路来源于提取公因式后充分应用方程的关系,省去一维的枚举过程。type ji=record w,s:longint;end;var q:array[0..2005] of ji; f:array[-2000..2000,0..2000] of longint; x,i,j,k,head,tail,t,maxp,w,api,bpi,asi,bsi:longint;function max(x,y:longint):longint;begin if x>y then exit(x); exit(y);end;begin readln(t,maxp,... 阅读全文

posted @ 2011-10-20 07:45 reflec94 阅读(354) 评论(0) 推荐(0) 编辑

导航