當(dāng)前位置:
首頁(yè) >
poj 3460 bookstore
發(fā)布時(shí)間:2024/9/5
45
豆豆
生活随笔
收集整理的這篇文章主要介紹了
poj 3460 bookstore
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
分析:第二道IDA*題目。
那個(gè)估價(jià)函數(shù)確實(shí)不好想,不過(guò)做了這道題目之后應(yīng)該對(duì)IDA*的應(yīng)用范圍有了更為明確地了解。IDA*應(yīng)用于搜索樹(shù)的深度比較小,但是每一層擴(kuò)展出來(lái)的節(jié)點(diǎn)呈指數(shù)增長(zhǎng),這樣的話(huà)BFS空間上受不了,DFS時(shí)間上受不了。于是想到用迭代加深搜索,即ID搜索。但是普通的ID搜索并不能快很多,于是有了IDA*搜索。這當(dāng)中最難的就是A*中的估價(jià)函數(shù)的設(shè)計(jì),這一點(diǎn)需要充分利用題目中的條件,保證估價(jià)函數(shù)小于等于實(shí)際最優(yōu)值,而且要盡量接近最優(yōu)值。這樣的話(huà)會(huì)快很多。
代碼:
typearr=array[0..15] of integer; vara,b:arr;i,j,k,n,t,step,ans:longint;vv:boolean;function ok:boolean; vari:longint; beginfor i:=1 to n doif a[i]<>i then exit(false);exit(true); end;function h:longint; vari:longint; beginh:=0;for i:=1 to n-1 doif a[i+1]<>a[i]+1 theninc(h);h:=(h-1)div 3+1; end;procedure IDAstar(deep:longint); varf,i,j,k,l,s:longint;c:arr; beginif ok thenbeginvv:=true;ans:=deep;exit;end;f:=h;if deep+f>step then exit;for i:=1 to n-1 dofor j:=1 to n-i dofor k:=i+j to n dobeginc:=a;s:=i;for l:=k-j+1 to k dobegina[l]:=c[s];inc(s);end;for l:=1 to k-j+1-i dobegina[l+i-1]:=c[l+i-1+j];end;IDAstar(deep+1);if vv then exit;a:=c;end; end;beginreadln(t);while t>0 dobegindec(t);readln(n);for i:=1 to n do read(b[i]);vv:=false;ans:=maxlongint;for step:=1 to 4 dobegina:=b;IDAstar(0);if vv then break;end;if not vv then writeln('5 or more')else writeln(ans);end; end.
注意的是迭代的第一個(gè)解肯定是最優(yōu)解,而且找到解之后要及時(shí)跳出,不能再繼續(xù)搜索了。
轉(zhuǎn)載于:https://www.cnblogs.com/reflec94/archive/2011/10/20/2218441.html
總結(jié)
以上是生活随笔為你收集整理的poj 3460 bookstore的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++中的rtti
- 下一篇: listView动态加载数据分页