2014百度之星初賽第二輪解題報告 chess

2022-08-10 19:54:14 字數 1777 閱讀 9900

chess

時間限制:3s 記憶體限制: 65536k

問題描述

小度和小良最近又迷上了下棋。棋盤一共有n行m列,我們可以把左上角的格仔定為(1,1),右下角的格仔定為(n,m)。在他們的規則中,「王」在棋盤上的走法遵循十字路線。也就是說,如果「王」當前在(x,y)點,小度在下一步可以移動到(x + 1,y),(x − 1,y),(x,y + 1),(x,y − 1),(x + 2,y),(x − 2,y),(x,y + 2),(x,y − 2)這八個點中的任意乙個。

圖1 黃色部分為棋子所控制的範圍

小度覺得每次都是小良贏,沒意思。為了難倒小良,他想出了這樣乙個問題:如果一開始「王」在(x0,y0)點,小良對「王」連續移動恰好k步,一共可以有多少種不同的移動方案?兩種方案相同,當且僅當它們的k次移動全部都是一樣的。也就是說,先向左再向右移動,和先向右再向左移動被認為是不同的方案。

小良被難倒了。你能寫程式解決這個問題嗎?

輸入:輸入包括多組資料。輸入資料的第一行是乙個整數t(t≤10),表示測試資料的組數。

每組測試資料只包括一行,為五個整數n,m,k,x0,y0。(1≤n,m,k≤1000,1≤x0≤n,1≤y0≤m)

輸出:對於第k組資料,第一行輸出case #k:,第二行輸出所求的方案數。由於答案可能非常大,你只需要輸出結果對9999991取模之後的值即可。

樣例輸入:

22 2 1 1 1

2 2 2 1 1

樣例輸出:

case #1:

2case #2:

4解題報告:

最直接是使用o(nmk)的dp方式,用dp[x][y][k]表示第k步跳轉到(x,y)的方案數,然後逐步遞推。但是由於時間複雜度比較高,所以需要考慮優化的方式。

考慮一次移動k步的方案,可以發現行和列的移動方式是獨立的。因此可以先分別求出在行和列上移動的方案數,再列舉k步裡有多少步分別是縱向和橫向移動的

假設a[x][k]表示起始橫座標為x0,

移動k步到橫座標為x的方案數,通過遞迴可求得每個a[x][k],則可求得縱向移動k步的方案數v[k]

= sum(a[x][k] 1<=x<=n)

假設b[y][k]表示起始縱座標為y0,移動k步到縱座標為y的方案數,通過遞迴可求得每個a[y][k],則可求得橫向移動k步的方案數h[k] = sum(b[y][k] 1<=y<=m)

最終答案為sum(c(k,i)*v*h[k-i]0<=i<=k)。總體複雜度可以降低到o(nk)

+ o(mk)

解題**:

#include #include const int n = 1000 + 1;

const int mod = 9999991;

int n, m, k, x0, y0;

int c[n][n], buffer[n][n], horizonal[n], vertical[n];

void solve(int *number, int n, int x0)

if (j - 2 >= 1)

if (j + 1 <= n)

if (j + 2 <= n) }}

for (int i = 0; i <= k; ++ i)

}}int main()

}int test_count;

int t = 1;

scanf("%d", &test_count);

while (test_count --)

printf("case #%d:\n%d\n", t++, answer);

}return 0;

}

百度之星2018初賽A輪

題目描述 題解 簽到題。排個序列舉小的兩條然後二分出第三條就好了。其實排序之後只要看連續的三條就行了。include define n 1005 using namespace std int n,s n ans int main printf d n ans return 0 題解 當時腦子抽了寫...

2020百度之星初賽二 Covid

problem description 科學家小沃沃在研究病毒傳播的規律,從而控制疫情。有 n 個人,編號分別為 1,2,n。我們用螢光粉代替病毒,編號為 1 的人,在第 0 時刻塗上了螢光粉,剩下的人在第 0 時刻沒有塗。對於第 i 個人,我們知道這個人在哪些時刻出現在了哪些地方。如果時刻 t,某...

百度之星 初賽第二場 B題

怎麼說呢,只能說自己還不夠熟練,能力還不夠,細心成都還不夠吧。這樣的二分題目在poj的訓練計畫裡面有類似的題目,自己也是都刷了,可是在調這道題目的時候廢了老大的盡了,比賽結束後聽polla的一句思路 找出最大的t,如果按t分類,可分出1組,按0分類分出n組,二分列舉t然後利用並查集判斷分出多少種類。...