bzoj1566 Noi2009 管道取珠

2022-04-30 05:27:09 字數 958 閱讀 6940

題意:

兩個棧不斷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 樣...