构思上还是比较简单,我们可以递归的思考问题。每一个字符串都包含三部分根节点str[0]左子树str[1]-str[k]与右子树str[k+1]-str[n-1]根据乘法原理
整棵树的方案数=左子树方案数*右子树方案数。这样一分析我们可以看到了这是一个区间上动态规划的问题。
剩下来的就简单了,先套一下模版三层循环,再把式子列上去就ok了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define ll long long 6 #define MOD 1000000000 7 #define LEN 310 8 using namespace std; 9 10 ll dp[LEN][LEN]; 11 char str[LEN]; 12 int n; 13 14 int main() 15 { 16 // freopen("in.txt", "r", stdin); 17 18 while(scanf("%s", str)!=EOF){ 19 memset(dp, 0, sizeof dp); 20 n = strlen(str); 21 for(int i=0; i<n; i++) dp[i][i] = 1; 22 for(int k=1; k<n; k++){ 23 for(int i=0; i+k<n; i++){ 24 int j = i+k; 25 for(int x=i+2; x<=j; x++){ 26 if(str[x]==str[j] && str[i+1]==str[x-1] && str[i]==str[x]) 27 dp[i][j] += dp[i+1][x-1]*dp[x][j]%MOD; 28 dp[i][j] %= MOD; 29 } 30 } 31 } 32 printf("%lld ", dp[0][n-1]%MOD); 33 } 34 return 0; 35 }