題意:
兩個棧不斷pop,共c(n+m,n)種,ai表示每個相同序列的方案數,求∑(ai^2)
sol :首先,將相同的序列看做兩個人選取後相同的方案數
考慮dp,dp[i][j][k][l]表示第乙個人從上面選i個,下面選j個,第二個人上k個下l個的答案
顯然第四維狀態可以由前三維決定
不過還是不太好轉移,將狀態換為dp[i][j][k]表示選了i個點,第乙個人從上面選了j個,第二個人從上面選了k個的答案
這樣的話第一維還可以用滾動陣列優化
所以轉移如下(tmp=0或1)
if(a[j+1]==b[i-k+1]) dp[!tmp][j+1][k]=(dp[!tmp][j+1][k]+dp[tmp][j][k])%p;if(b[i-j+1]==a[k+1]) dp[!tmp][j][k+1]=(dp[!tmp][j][k+1]+dp[tmp][j][k])%p;
if(b[i-j+1]==b[i-k+1]) dp[!tmp][j][k]=(dp[!tmp][j][k]+dp[tmp][j][k])%p;
if(a[j+1]==a[k+1]) dp[!tmp][j+1][k+1]=(dp[!tmp][j+1][k+1]+dp[tmp][j][k])%p;
**
#include#include#include
#include
using
namespace
std;
const
int mx=510
;const
int p=1024523
;int n,m,a[mx],b[mx],dp[2
][mx][mx];
char
c1[mx],c2[mx];
intmain()
}cout
<2][n][n]
}
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 管道取珠
第一行包含兩個整數n,m,分別表示上下兩個管道中球的數目。第二行為乙個ab字串,長度為n,表示上管道中從左到右球的型別。其中a表示淺色球,b表示深色球。第三行為乙個ab字串,長度為m,表示下管道中的情形。僅包含一行,即為 sigma ai 2 i從1到k 除以1024523的餘數。2 1abb5 樣...