做這道題花了很多時間,所以沒有長期的訓練,想要在短時間內解決這種題目還是有一定的難度。
du熊的機械人
description
du熊正在玩乙個別人剛送給它的機械人。這個機械人只能在乙個棋盤中行走,棋盤的左上角格仔為(0, 0),右下角格仔為(x, y)。
du熊控制這個機械人從棋盤的左上角,走到右下角,再從右下角回到左上角。當機械人從左上角走到右下角的過程中,如果它當前所在格仔為(x, y),則它只能走到(x+1, y)或(x, y+1)的格仔;當機械人從右下角走回左上角的過程中,如果它當前所在的格仔為(x, y),則它只能走到(x-1, y)或(x, y-1)的格仔。並且du熊要求機械人從左上角走到右下角再走回左上角的整個過程中,最多經過同乙個格仔一次。
請你幫du熊計算出這個機械人一共有多少種不同的路線。
input
輸入的第一行為乙個正整數t(0接下來的t行,每行有兩個整數,分別表示x和y。(1<=x,y<=1000)
output
對每組輸入資料,輸出乙個整數,表示機械人不同的路線數量。
sample input
31 1
1 1000
3 4sample output22
100問題分析:
群舉是第乙個直覺的做法,但題目裡要求x,y可以到1000,而x,y達到10就已經是比較大的乙個數,這個數目至少相當於從20的數中選10個出來。
第二想法是動態規劃,因為每個點的運動使其構成樹結構,但狀態轉移也不能很容易的找出來
定義s(m,n,x):滿足某種條件的路徑的數目,這些條件包括:
1、從座標(0,0)出發,經過(m,n),終點是(0,1)
2、經過每個座標最多一次
3、經過(x,0)
任一條逆時針可以走的路徑,順時針也滿足題目要求 ,所以
2*s(m,n,0)就是題目要求的值。而
根據我們的定義,終點是
(0,1),那麼第一步一定是(0,0)->(1,0),
s(m,n,0)等於s(m,n,1)。
接下來定義的狀態轉移:
終點是 (0,1),可以從兩個方向到達(0,1)
1、最後一步(1,1)->(0,1)
這種情況下,滿足條件的路徑有這樣的形式:(0,0)->(1,0)->...(m,n)->...->(1,1)->(0,1)
其數目等於
形式為(1,0)->...(m,n)->...->(1,1)的所有滿足條件的路徑的數目,等於形式為(0,0)->...(m-1,n)->...->(0,1)的的所有滿足條件的路徑的數目,等於s(m-1,n,x-1)
2、最後一步(0,2)->(0,1)
由定義,一定存在某一步:(x,0)->(x,1),這個是顯然的
對每個1<=x<=m,我們計算滿足形式(0,0)->...->(x,0)->(x,1)->...->
(m,n)->...->(0,2)->(0,1)的所有路徑的數目,定義這個數目為t(m,n,x)
所有經過
(x,0)形式滿足(0,0)->...->(x,0)...->
(m,n)->...->(0,2)->(0,1)的路徑的數目為sum(t(m,n,x:m))
怎麼求t(m,n,x)?觀察可以發現,t(m,n,x)恰好等於s(m,n-1,x)
總結一下
s(m,n,x)= s(m-1,n,x-1) + sum(s(m,n-1,x:m)
邊界條件:
我們總要要求起始點是(0,0)終點是(0,1),則s(m,0,x)=0,應為沒有
終點(0,1)不存在
s(0,n,x) = 0,
s(0,0,0)=1,
s(0,1,0)=1,
這幾個條件畫個圖都能簡單的推出來
空間複雜度:o(m*m*n),時間複雜度
o(m*m*n)
最後乙個問題,考慮到結算的結果特別大,狀態轉移矩陣可能要使用大數的資料結構
我的實現
#define al 1000+1
long pathcount(const size_t m, const size_t n)
s[m][n][0] = s[m][n][1];
} }return 2*s[m][n][0];
}
百度之星Valley Numer
problem description 眾所周知,度度熊非常喜歡數字。它最近發明了一種新的數字 valley number,像山谷一樣的數字。當乙個數字,從左到右依次看過去數字沒有出現先遞增接著遞減的 山峰 現象,就被稱作 valley number。它可以遞增,也可以遞減,還可以先遞減再遞增。在遞...
2018 百度之星
資格賽 problem a problem b problem c problem d problem e problem f 初賽 a problem a 簽到題problem b 用deque雙端佇列模擬即可。插入的時候用insert。problem c problem d problem e ...
百度之星B題
include include include include include include includeusing namespace std define clr arr,v memset arr,v,sizeof arr const double inf 1e 10 struct node...