题目来源:FOJ 2170 花生的序列
题意:给你一个长度为2*n的由W和B组成字符串 该字符串是由2个长度为n的并且是WBWBW....形式的 求有多少种组成方案
思路:dp[i][j] 代表第一个字符串长度为i 第二个字符串长度为j时的数量然后根据i和j的奇偶数递推
i为奇数 原来的字符串的第i位是W 为偶数是B
j同上
i+j是到输入的串的位置
#include <cstdio> #include <cstring> using namespace std; const int maxn = 2010; const int mod = 1000000007; char a[maxn]; int dp[maxn][maxn]; int main() { int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); scanf("%s", a+1); memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(int i = 0; i <= n; i++) { for(int j = 0; j <= n; j++) { if(!i && !j) continue; int p = i+j;//2个原串长度是i和j 到输入串的i+j位置 if((i&1) && (j&1)) //原串都是奇数 当前位必须都是W { if(a[p] == ‘W‘) { dp[i][j] += dp[i-1][j]; dp[i][j] %= mod; dp[i][j] += dp[i][j-1]; dp[i][j] %= mod; } } else if(i&1)//一奇一偶 分类讨论 { if(a[p] == ‘W‘) { dp[i][j] += dp[i-1][j]; dp[i][j] %= mod; } else { if(j) { dp[i][j] += dp[i][j-1]; dp[i][j] %= mod; } } } else if(j&1) { if(a[p] == ‘W‘) { dp[i][j] += dp[i][j-1]; dp[i][j] %= mod; } else { if(i) { dp[i][j] += dp[i-1][j]; dp[i][j] %= mod; } } } else//都是偶数 必须都是B { if(a[p] == ‘B‘) { if(i) { dp[i][j] += dp[i-1][j]; dp[i][j] %= mod; } if(j) { dp[i][j] += dp[i][j-1]; dp[i][j] %= mod; } } } } } printf("%d\n", dp[n][n]); } return 0; }
FOJ 2170 花生的序列 DP,码迷,mamicode.com
原文地址:http://blog.csdn.net/u011686226/article/details/24633597