P1758 NOI2009 管道取珠

2021-10-01 08:45:05 字數 984 閱讀 1582

分析:

這道題的難點在於轉化。對於這道題,我們要求的東西就相當於有兩個人在分別取球,求取出兩個序列完全一樣的方案數。

這樣轉化,問題就變得簡單多了。我們設f[i

][j]

[k][

l]

f[i][j][k][l]

f[i][j

][k]

[l]為第乙個人在第乙個串裡去了i

ii個,在第二個串裡取了j

jj個,第二個人在第乙個串裡取了k

kk個,在第二個串裡取了l

ll個,而且兩個序列完全相同的方案數。

n

=500

n = 500

n=50

0,四維dp肯定會mle的,這時候我們發現i+j

=k+l

i+ j = k + l

i+j=k+

l,我們可以省去第四維。然而n

3n^3

n3的空間也是承受不住的,然後我們又發現,第i

ii個狀態只與第i−1

i - 1

i−1個狀態有關,換句話說,我們可以用滾動陣列簡化第一維。

然後就可以ac啦!(記得開o2,否則會tle)

#include

#include

#include

#include

using

namespace std;

const

int pp =

1024523

;const

int n =

505;

int n, m, f[2]

[n][n]

;char s1[n]

, s2[n]

;int

main()

}}cout << f[n &1]

[m][n]

<< endl;

return0;

}

洛谷P1758 NOI2009 管道取珠

題目 管道取珠是小x很喜歡的一款遊戲。在本題中,我們將考慮該遊戲的乙個簡單改版。遊戲畫面如圖1所示 圖1 遊戲初始時,左側上下兩個管道分別有一定數量的小球 有深色球和淺色球兩種型別 而右側輸出管道為空。每一次操作,可以從左側選擇乙個管道,並將該管道中最右側的球推入右邊輸出管道。例如 我們首先從下管道...

NOI2009 管道取珠

noi2009 管道取珠 給出乙個長度為n的01序列 和乙個長度為m的01序列 給出 n m 個格仔,按順序將a和b填入,也就是事先選好n個位置,按順序地填入a,然後其它的按順序填入b,設填後的格仔有 c 次重複,問所有的格仔填法 c 2 的和,n,m leq 500 平方可以轉換為兩個人填,方案相...

NOI2009 管道取珠

sum a i a i 可以理解為兩個獨立但同時進行的遊戲得到同乙個輸出序列的方案數。設f l,i,j 為每個遊戲都已經推出了l個珠子時,第乙個遊戲裡上邊兒的管道已經推出了i個,第二個遊戲中上邊兒管道推出了j個的方案數。考慮到若要推出序列相同,那麼對於每個階段l,兩個遊戲的推出序列應始終相等。這樣,...