3-5乘法表问题
2015-10-24 17:10
281 查看
问题描述:定义于字母表{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 = x1 x2 x3……xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。
a b c
a b b a
b c b a
c a c c
依此乘法表,对任一定于于该表上的字符串,适当加括号后得到一个表达式。例如对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。依乘法表,该表达式的值为a。试设计一个动态规划算法,对任一于该字母表上的字符串x = x1 x2 x3……xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。
#include<iostream> const int N = 100; int arr [3]; /*str为字符串,length为字符串的长度,c为最终的值,返回值为最终值为c的加括号表达式方式的数量*<span id="transmark"></span>/ int function(char* str, int length, char c){ //init for (int i = 0; i < length; i++){ arr[i][i][str[i] - 'a'] = 1; } for (int r = 1; r < length; r++){ for (int i = 0; i < length - r; i++){ int j = i + r; for (int k = i; k < j; k++){ arr[i][j][0] += arr[i][k][0] * arr[k + 1][j][2] //a = ac + arr[i][k][1] * arr[k + 1][j][2] //a = bc + arr[i][k][2] * arr[k + 1][j][0]; //a = ca arr[i][j][1] += arr[i][k][0] * arr[k + 1][j][0] //b = aa + arr[i][k][0] * arr[k + 1][j][1] //b = ab + arr[i][k][1] * arr[k + 1][j][1]; //b = bb arr[i][j][2] += arr[i][k][1] * arr[k + 1][j][0] //c = ba + arr[i][k][2] * arr[k + 1][j][1] //c = cb + arr[i][k][2] * arr[k + 1][j][2]; //c = cc } } } return arr[0][length - 1][c - 'a']; } int main(void){ char* str = "bbbba"; std::cout << function(str, 5, 'a'); return 0; }
相关文章推荐
- h5学习地址
- Python中转到指定目录
- hdu2102 bfs
- iOS 导航栏颜色渐变与常用属性
- http协议post
- Linux内核与实现
- mysql性能优化十大建议(处理大量数据时)
- 树上倍增求LCA(最近公共祖先)
- Android 命名规范 (提高代码可以读性)
- 编程珠玑第二章习题—向量的旋转
- POJ 1128【并查集】
- 四校联训Round7心得体会
- 树上倍增求LCA(最近公共祖先)
- C++ this指针详解
- Force removing ActivityRecord no saved state问题的原因分析及解决方法
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
- 使用repeater开发出现 回发或回调参数无效 的问题
- 2015年10月22日作业
- opencv 使用tic toc 来记录时间
- 小白笔记----pipe管道(2)(dup的用法)