以a为例
-
代码
#include<stdio.h>
const int N = 20;
int table[4][4] = { {0,0,0,0},
{0,2,2,1},
{0,3,2,1},
{0,1,3,3} };
//存放表达式
char CharExpression[N];
int IntExpression[N];
int expLen=0;
int m[N][N][4] = {0};//m[i][j][1] 表示exp[i-j] 可以得到值为a,b,c 的加括号方式数
//字母转换为对应数字
int trans(char x) {
if (x == 'a') {
return 1;
}else if (x == 'b') {
return 2;
}
else if (x == 'c') {
return 3;
}
}
int main() {
scanf("%s", CharExpression);//输入
for (int i = 0; CharExpression[i]!='\0'; i++) {//获得长度
expLen++;
}
for (int i = 1; i <= expLen; i++) {//转换
IntExpression[i] = trans(CharExpression[i-1]);
}
//基础解 表达式长度为1
for (int i = 1; i <= expLen; i++) {
m[i][i][1] = 0;
m[i][i][2] = 0;
m[i][i][3] = 0;
m[i][i][IntExpression[i]] = 1;
}
//动态规划
for (int r = 2; r <= expLen; r++) {//表达式长度
for (int s = 1; s <= expLen - r + 1; s++) {//表达式起点
int e = s + r - 1;//表达式终点
for (int k = s + 1; k <= e; k++) {//断点 k=s+1 表示分割[s:e] 为 [s] [s+1,...,e]
m[s][e][1] += m[s][k - 1][1] * m[k][e][3] + m[s][k - 1][2] * m[k][e][3] + m[s][k - 1][3] * m[k][e][1];
m[s][e][2] += m[s][k - 1][1] * m[k][e][1] + m[s][k - 1][1] * m[k][e][2] + m[s][k - 1][2] * m[k][e][2];
m[s][e][3] += m[s][k - 1][2] * m[k][e][1] + m[s][k - 1][3] * m[k][e][2] + m[s][k - 1][3] * m[k][e][3];
}
}
}
printf("%d", m[1][expLen][1]);
return 0;
}