一、问题描述
定义于字母表∑{a,b,c)上的乘法表如表1所示
表1∑乘法表
a b c
a b b a
b c b a
c a c c
依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。例如,对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。依乘法表,该表达式的值为a。试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。
源码如下:
#include <stdio.h>
#include <string.h>
void Multiply(int p[][100][3],char b[])
{
int i,j,k,t,n;
n=strlen(b);
for(i=0;i<n;i++)
{
p[i][i][b[i]-'a']=1;
}
for( k = 1;k<n;k++)
{
for( i = 0;i<n-k;i++)
{
j = i + k;
for( t = i;t < j;t++)
{
p[i][j][0] += p[i][t][0]*p[t+1][j][2] + p[i][t][1]*p[t+1][j][2] + p[i][t][2]*p[t+1][j][0];
p[i][j][1] += p[i][t][0]*p[t+1][j][0] + p[i][t][0]*p[t+1][j][1] + p[i][t][1]*p[t+1][j][1];
p[i][j][2] += p[i][t][1]*p[t+1][j][0] + p[i][t][2]*p[t+1][j][1] + p[i][t][2]*p[t+1][j][2];
}
}
}
printf("%d\n",p[0][n-1][0]);
}
int main()
{
int i=0;
char b[20];
char c;
int p[100][100][3] = {0};
// printf("请输入由abc组成的字符串:");
while((c=getchar())!='\n')
{
b[i]=c;
i++;
}
b[i]='\0';
Multiply(p,b);
return 0;
}