題目:
題意:給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,配對的規則是a
與t
配對,c
與g
配對,新增鹼基的位置與數量不同的方案視為不同,求不同的方案數。
0n≤2000
。題解:
可以考慮算出序列t在序列s裡匹配的本質不同方案數,利用dp可以很容易解決這個問題。 令f
[i][
j]表示序列s前i位匹配序列t至第j位的方案數,則對於f[
i][j
] ,若不用s[
i]匹配t[
j],則為f[
i−1]
[j] ,若能匹配,則可由f[
i−1]
[j−1
] 轉化至該狀態,最終的答案為f[
n][m
] ,dp可滾動。
粗略估計答案的上界,可以發現存在情況使得答案超過264
,但不可能超過c(
2000
,1000
) 或者更小,dp直接配上高精度即可。
**:
#include
const
int maxn = 2001, maxl = 70, mod = 1000000000;
struct bigint
void print()
void
operator += (const bigint &x)
}if(num[len]) ++len;
}} f[maxn];
inline
bool check(char a, char b)
int n, m;
char s[maxn], t[maxn];
int main()
2764 JLOI2011 基因補全
題目鏈結 題目大意 給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,求方案數 題解 f i j 表示長串 匹配到i 短串匹 配到j的 方案數 f i j f i 1 j 短串 乙個字 母 f i j f i 1 j 1 長 短串可以 匹配...
BZOJ3192 JLOI2013 刪除物品
原題位址 自己想的奇葩做法 對於乙個優先順序為x的物品,考察該物品下方優先順序大於x物品的優先順序被分成了多少個連續段 舉個例子,如x 4,該物品下方物品的優先順序有5,6,7,9,10,13,14,19,則段數為4 則該物品需要被移動的次數k 段數 2 優先順序為x 1的物品在該物品下方?1 0 ...
bzoj4006 JLOI2015 管道連線
傳送門 思路 一眼看上去很像斯坦納樹 但是限制稍有不同,只要每種顏色的點聯通即可 也就是說最後可能是森林 我聽說裸寫斯坦納樹有90 所以我們要在外面再套一層dp f i j 還是斯坦納樹的狀態,i是以i為根,j是狀態為j 先用斯坦納樹求出每種聯通狀況的最小費用 再設dp i 表示i這個狀態的最小費用...