bzoj1566 NOI2009 管道取珠

2022-05-02 04:45:09 字數 1397 閱讀 5376

第一行包含兩個整數n, m,分別表示上下兩個管道中球的數目。 第二行為乙個ab字串,長度為n,表示上管道中從左到右球的型別。其中a表示淺色球,b表示深色球。 第三行為乙個ab字串,長度為m,表示下管道中的情形。

僅包含一行,即為 sigma(ai^2) i從1到k 除以1024523的餘數。

2 1abb5

樣例即為文中(圖3)。共有兩種不同的輸出序列形式,序列bab有1種產生方式,而序列bba有2種產生方式,因此答案為5。 

【大致資料規模】

約30%的資料滿足 n, m ≤ 12; 

約100%的資料滿足n, m ≤ 500。

正解:$dp$。

思路比較巧妙。注意到$a_$平方以後不好處理,那麼我們可以下意識地想到,其實這就是$4$個管道輸出序列相同的一種情況。兩個管道相同的有$a_$種方案,那麼$4$個管道方案組合,自然也就有$a_^$種方案了。

接下來的事就很簡單了,設$f[i][j][k][l]$表示$4$個管道分別丟了第$i$個,第$j$個,第$k$個,第$l$個珠子的相同序列方案數。因為我們要求兩個序列要相同,所以很顯然,$i+j=k+l$,於是我們可以去掉$l$這一維狀態。然後我們判斷$4$個珠子兩兩相等的情況轉移就行了。

1

//it is made by wfj_2048~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13#define rhl (1024523)

14#define il inline

15#define rg register

16#define ll long long

17#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

1819

using

namespace

std;

2021

int f[510][510][510

],n,m;

22char a[510],b[510

];23

24 il int

gi()

3132 il void

work()

42if (a[i]==b[i+j-k] &&i)

46if (b[j]==a[k] && j &&k)

50if (b[j]==b[i+j-k] &&j)54}

55 printf("

%d\n

",f[n][m][n]); return;56

}5758int

main()

bzoj1566 NOI2009 管道取珠

第一行包含兩個整數n,m,分別表示上下兩個管道中球的數目。第二行為乙個ab字串,長度為n,表示上管道中從左到右球的型別。其中a表示淺色球,b表示深色球。第三行為乙個ab字串,長度為m,表示下管道中的情形。output 僅包含一行,即為 sigma ai 2 i從1到k 除以1024523的餘數。sa...

bzoj1566 NOI2009 管道取珠

題目大意 兩個輸入管道裡面分別有n m個有著兩種顏色的珠子。只從右端取。依次於輸出管道中形成。設對於一種的輸出方式有ai 種產生方法有k種不同的輸出方式,求 k i 1a 2i。題解 智商dp 看到a 2i想到什麼呢?ai ai 嗯.a i 是相同方式的產生方法的個數,那麼ai ai 就可以看成兩個...

bzoj1566 Noi2009 管道取珠

題意 兩個棧不斷pop,共c n m,n 種,ai表示每個相同序列的方案數,求 ai 2 sol 首先,將相同的序列看做兩個人選取後相同的方案數 考慮dp,dp i j k l 表示第乙個人從上面選i個,下面選j個,第二個人上k個下l個的答案 顯然第四維狀態可以由前三維決定 不過還是不太好轉移,將狀...