NOI2009 管道取珠

2022-02-04 15:55:54 字數 846 閱讀 4861

[noi2009]管道取珠

給出乙個長度為n的01序列\(\\)和乙個長度為m的01序列\(\\),給出\(n+m\)個格仔,按順序將a和b填入,也就是事先選好n個位置,按順序地填入a,然後其它的按順序填入b,設填後的格仔有\(c\)次重複,問所有的格仔填法\(c^2\)的和,\(n,m\leq 500\)。

平方可以轉換為兩個人填,方案相同的方案數,於是設\(f[i][j][k]\)表示兩個人都填到了第i個個子,兩人分別填到a序列中的第j個位置第k個位置的方案相同的方案數。

顯然可以得知它們分別填到b序列的第\(i-j,i-k\)個位置,於是有

\[f[i][j][k]=\beginf[i-1][j-1][k-1](a[j]==a[k])\\f[i-1][j-1][k](a[j]==b[i-k])\\f[i-1][j][k-1](b[i-j]==a[k])\\f[i-1][j][k](b[i-j]==b[i-k])\end

\]顯然邊界為\(f[0][0][0]=1\),答案是\(f[n+m][n][m]\)

#include #include #define il inline

#define ri register

#define size 550

#define gzy 1024523

using namespace std;

bool a[size],b[size];

int dp[size][size];

il void get(char&);

int main()printf("%d",dp[n][n]);

return 0;

}il void get(char &c)

NOI2009 管道取珠

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

NOI2009 管道取珠

對於處理方案數量平方的優化 可以看成兩個人玩同乙個遊戲,他們輸出序列一樣的種類數。然後設f i1 j1 i1 j2 為當前狀態方案數量的平方和。i1,i2表示第乙個人上管道,下管道分別取出了i1,i2個,i2,j2表示第二個人 i1 j1 i2 j2,所以可以把最後一維去掉。然後加乙個滾動陣列可以進...

NOI2009 管道取珠

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