3-8 乘法表问题
问题描述
定义于字母表∑{a,b,c}上的乘法表如表所示:
| a | b | c | |
| a | b | b | a |
| b | c | b | a |
| c | a | c | c |
依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。
例如,对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。依乘法表,该表达式的值为a。
试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xnx=x1x2…xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。
Java
import java.util.Scanner;
public class ChengFaBiao {
private static int n;
private static String s;
private static int[][][] count;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while (true){
s = input.next();
n = s.length();
count = new int[n][n][3];
for(int i=0; i<n; i++)
count[i][i][s.charAt(i)-'a'] = 1;//0:a,1:b,2:c
for(int k=1; k<n; k++)
for(int i=0; i<n-k; i++) {
int j = i+k;
for(int p=i; p<j; p++){
count[i][j][0] += count[i][p][0]*count[p+1][j][2] + count[i][p][1]*count[p+1][j][2] + count[i][p][2]*count[p+1][j][0];
count[i][j][1] += count[i][p][0]*count[p+1][j][0] + count[i][p][0]*count[p+1][j][1] + count[i][p][1]*count[p+1][j][1];
count[i][j][2] += count[i][p][1]*count[p+1][j][0] + count[i][p][2]*count[p+1][j][1] + count[i][p][2]*count[p+1][j][2];
}
}
System.out.println(count[0][n-1][0]);//count[0][n-1][0]:表示从字符串的第0位到n-1位,乘积结果为a的不同加括号方式种数
}
}
}
Input & Output
bbbba
6
bbbc
3
cbcac
7
abccba
14
Reference
王晓东《计算机算法设计与分析》(第3版)P91

本文介绍了如何使用动态规划解决3-8乘法表问题,针对给定的字母表,计算字符串的不同加括号方式,使得表达式的值等于特定字符a。提供了问题描述、Java实现及输入输出示例。
1万+

被折叠的 条评论
为什么被折叠?



