這種題目還需要解析??
這不是理所當然的嗎?
她看向了第二個題目。
題目2:在一個n??的方格陣中,每一個格子賦予一個數(即權值),規定每次移動時隻能向上或者向右,現試找一條路勁,使其從左下角至右上角所經過的權值之和最大。
解析:在這種情況下
一步一步看下來。
蘇牧倒也沒覺得有什麼難的,隻不過是一些取極值的問題。
但是,當他翻到後麵的經典習題和解析的時候,整個人都不好了。
【經典習題】在8x8方格的棋盤上,從任意指定方格出發,為馬尋找一條走遍棋盤每一格並且隻經過一次的一條路徑。
解析:首先這是一個搜索問題,運用深度優先搜索進行求解,算法如下:
1輸入初始位置坐標x,y;
2步驟 c:
如果capgt 64輸出一個解,返回上一步驟c--
(x,y)← c
計算(x,y)的八個方位的子結點,選出那些可行的子結點
循環遍曆所有可行子結點,步驟c++重複2
顯然2是一個遞歸調用的過程,大致如下(c++程序解析):
defe n 8
void dfs(t x,t y,t unt)
{
t i,tx,ty
if(untapgtnn)
{
output_tn()輸出一個解
return
}
for(i=0 iaplt8 i++)
{
tx=hn[xhn[]保存八個方位子結點
ty=hn[y
s[tx][ty]=unt
dfs(tx,ty,unt+1)遞歸調用
s[tx][ty]=0
}
}
這樣做是完全可行的,因為它輸入的是全部解。
但是馬遍曆當8x8時解是非常之多,用天文數字形容也不為過,這樣一來我們的求解的過程就非常慢,並且出一個解的時間也會也非常慢。
當我們在每個結點對其子結點進行選取的時候,優先選擇‘出口’最小的進行搜索,‘出口’的意思是在這些子結點中它們的可行子結點的個數,也就是‘孫子’結點越少的越優先跳。
如果優先選擇出口多的子結點,那出口少的子結點就會越來越多,很可能出現‘死’結點
這樣對下麵的搜索純粹是徒勞,這樣就會浪費很多無用的時間。
反過來如果每次都優先選擇出口少的結點跳,那出口少的結點就會越來越少,這樣跳成功的機會就更大一些。
蘇牧:“。。。。”
他的腦海中再次緩緩的出現了一堆問號。
完全沒想到居然會有這麼大的跨越。
看著僅僅隻有一個小題,卻是密密麻麻的解析,蘇牧突然明白了為什麼數學奧賽參加的人那麼多,信息學奧賽參加的人卻那麼少。
這東西,確定是適合青少年做的??
不會禿頂嗎??
ps:因為要開始上網課了要準備的東西挺多的,後麵也會慢慢忙起來,所以更新時間偶爾會些變化,但是每天兩更應該可以保持住
ps2:弱弱的求幾張推薦票。