算法设计与分析: 3-8 乘法表问题

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

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=x1x2xnx=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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值