`
人生难得糊涂
  • 浏览: 117872 次
社区版块
存档分类
最新评论

乘法表问题

 
阅读更多

定义于字母表∑{a,b,c)上的乘法表如表1所示

  a b c
a b b a
b c b a
c a c c

 

依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。例如,对于字符串x=bbbba,它的一个加括号表达式为 i(b(bb))(ba)。依乘法表,该表达式的值为a。试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括 号方式,使由x导出的加括号表达式的值为a
要求:
     输入:输入一个以a,b,c组成的任意一个字符串。
     输出:计算出的加括号方式数。

 

算法思想:

结果a可拆为a*c,b*c,c*a.设dp[i][j][0]为字符串从i到j 结果为a的括号方式。

那么,dp[i][j][0]=∑(dp[i][m][0]*dp[m+1][j][2]//a*c

                         +dp[i][m][1]*dp[m+1][j][2]//b*c

                         +dp[i][m][2]*dp[m+1][j][0];//c*a)

(其中i<=m<j)

类比于求矩阵连乘最少计算量问题,我们可以确定其计算次序


因此可以得出如下代码:

#include "iostream"
using namespace std;
int map[3][3]={{1,1,0},{2,1,0},{0,2,2}};
int main()
{
	char c[10];
	int dp[10][10][3];
	int i=0,j,k;
	int b[10];
	while(scanf("%c",&c[i]),c[i++]!='\n')
	{
		b[i-1]=c[i-1]-97; //'a'对应0,'b'对应1,'c'对应2
	};
	int len=i-1;
	for (i=0;i<len;i++)
	{
		for (j=0;j<len;j++)
		{
			dp[i][j][0]=0;
			dp[i][j][1]=0;
			dp[i][j][2]=0;
			if (i==j)//初始化对角线上的元素
			{
				if (b[i]==0)
				{
					dp[i][j][0]=1;
				}
				if (b[i]==1)
				{
					dp[i][j][1]=1;
				}
				if (b[i]==2)
				{
					dp[i][j][2]=1;
				}
			}
		}
	}
	for (k=1;k<len;k++)
	{
		for (i=0;i<len-k;i++)
		{
			j=i+k;
			for (int m=i;m<j;m++)
			{
				int t=dp[i][m][0]*dp[m+1][j][2]+dp[i][m][1]*dp[m+1][j][2]+dp[i][m][2]*dp[m+1][j][0];
				dp[i][j][0]+=t;//max(dp[i][j][0],t);
				t=dp[i][m][0]*dp[m+1][j][0]+dp[i][m][0]*dp[m+1][j][1]+dp[i][m][1]*dp[m+1][j][1];
				dp[i][j][1]+=t;//max(dp[i][j][1],t);
				 t=dp[i][m][1]*dp[m+1][j][0]+dp[i][m][2]*dp[m+1][j][1]+dp[i][m][2]*dp[m+1][j][2];
				dp[i][j][2]+=t;//max(dp[i][j][2],t);
			}
			
		}
	}

	printf("%d\n",dp[0][len-1][0]);
	return 0;
}

 
 

 

  • 大小: 17.2 KB
分享到:
评论

相关推荐

    乘法表问题.docx

    【乘法表问题】是一个基于动态规划的算法设计问题,主要目标是计算字符串的不同加括号方式,使得根据特定乘法表得出的表达式值等于预设的目标值a。问题的关键在于利用动态规划方法解决子问题重叠和最优子结构的特点...

    实现3-5乘法表问题.cpp

    实现3-5乘法表问题.cpp

    乘法表问题python.zip

    标题中的“乘法表问题”通常是指在编程中创建一个乘法表格,这在教育或初学者编程练习中很常见。Python是一种流行的编程语言,以其易读性和简洁性而受到欢迎,非常适合这样的任务。让我们深入探讨如何使用Python来...

    java 乘法表 java 乘法表

    java 乘法表 java 乘法表java 乘法表java 乘法表java 乘法表java 乘法表java 乘法表java 乘法表java 乘法表

    C语言 九九乘法表

    本文将深入探讨如何使用C语言来实现一个简单的九九乘法表,包括上三角形、下三角形以及完整表格的4种形式的输出。 首先,我们需要了解九九乘法表的基本概念。九九乘法表,又称乘法口诀表,是数学教育中用于学习乘法...

    C#写的九九乘法表,99乘法表

    在编程领域,尤其是在初学者阶段,编写简单的程序如九九乘法表是一个常见的练习,它可以帮助我们更好地理解和掌握基础语法。在这个案例中,我们讨论的是一个使用C#语言在WinForms环境下实现的九九乘法表程序。让我们...

    99乘法表学生

    99乘法表,也被称为九九乘法表,在中国的教育体系中是小学生学习基础数学运算的重要工具。这个乘法表是由1到9的所有整数两两相乘组成的一个方阵,展示了数字间的乘法规律,帮助孩子们快速记忆和理解乘法关系。在这个...

    简易九九乘法表 九九乘法表

    九九乘法表 简易九九乘法表 简易九九乘法表

    用VB制作的九九乘法表

    【VB制作九九乘法表】是一个典型的编程实践案例,主要使用了Visual Basic 6.0(VB6.0)这一编程环境。VB是Microsoft公司推出的一种面向对象的可视化编程工具,它允许开发者通过拖拽控件和编写事件驱动的代码来创建...

    python九九乘法表

    ### Python实现九九乘法表 #### 背景与目的 九九乘法表是学习数学的基础之一,尤其在小学阶段,对于学生理解和掌握基本的乘法运算有着重要的意义。在计算机科学领域,通过编程实现九九乘法表不仅能够帮助初学者...

    99乘法表99乘法表计算99乘法表计算

    99乘法表99乘法表计算99乘法表计算

    java编写一个乘法表

    ### Java编写乘法表知识点详解 #### 一、程序概述 在本篇文章中,我们将深入探讨如何使用Java语言编写一个简单但功能完善的乘法表程序。该程序能够生成1到9的乘法表,并且输出格式整齐美观。通过这个例子,我们...

    ASP.NET实现九九乘法表

    在这个“ASP.NET实现九九乘法表”的项目中,我们将会探讨如何利用ASP.NET的技术来生成一个网页,显示传统的数学九九乘法表。这对于ASP.NET初学者来说,是一个很好的实践案例,有助于理解服务器端编程的基本概念和...

    实用九九乘法表_实用九九乘法表

    通过学习如何用C语言实现九九乘法表,不仅可以掌握基本的编程技能,还能培养解决问题和逻辑思维的能力。这个程序虽然简单,但它是一个很好的起点,为以后更复杂的项目打下基础。在实践中,你可以尝试优化代码,比如...

    NN乘法表 C#源代码

    在编程领域,C#是一种广泛使用的面向对象的编程语言,由...总之,“NN乘法表 C#源代码”项目是一个不错的实践C#编程和面向对象设计的起点,不仅可以帮助初学者巩固基础,也能让经验丰富的开发者锻炼解决问题的能力。

    用servlet写的九九乘法表

    在这个“用servlet写的九九乘法表”项目中,我们可以深入理解Servlet的基本工作原理以及如何将其应用于简单的Web应用程序。 首先,我们需要了解Servlet的生命周期。Servlet在服务器启动时并不立即加载,而是在接收...

    100×100乘法表 100以内乘法口诀

    乘法是数学中的基础运算之一,而100×100乘法表和100以内的乘法口诀则是这一基础中的基石。它们不仅对于儿童来说是学习数学的重要工具,也是成人培养逻辑思维、提高计算能力不可或缺的训练材料。掌握这些内容,对于...

    乘法表的实现 乘法表

    在编程领域,实现一个乘法表是一个常见的初学者练习,它可以帮助我们理解基本的循环结构和数组操作。这里我们将深入探讨如何使用C语言来实现一个简单的乘法表,并且通过这个过程,我们可以学习到C语言的一些核心概念...

Global site tag (gtag.js) - Google Analytics