NOI2009管道取珠(dp)

2022-07-13 20:48:33 字數 666 閱讀 6472

題意:給定兩列球,可以從任意一列球的末尾彈出乙個球,最後會得到乙個序列,設第i種序列可以被a[i]種操作產生,那麼會產生a[i]^2的貢獻,求貢獻和、

solution:

首先我們觀察a[i]^2的含義,發現它是有a[i]種序列兩兩之間產生1的貢獻。

於是我們就有了乙個dp的思路,dp[i][j][k][l]表示一種序列為在第一列有i個,另一列有j個,另一種序列在第一列有k個,在第二列有l個。他們產生一樣的輸出序列的方案數。

轉移就列舉一下乙個彈什麼。

因為i+j=k+l所以我們可以去掉一維,第一位陣列也可以滾動,空間複雜度n^2,時間複雜度n^3.

code

#include#include

#include

#include

#define n 503

using

namespace

std;

const

int mod=1024523

;int

dp[n][n][n],n,m,now;

char

s1[n],s2[n];

inline

void mode(int &x)

intmain()

}cout

}

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,兩個遊戲的推出序列應始終相等。這樣,...

NOI2009 管道取珠

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