MOOC清华《程序设计基础》第6章第3题:最大乘积问题(动态规划)
来源:互联网 发布:马氏链模型matlab编程 编辑:程序博客网 时间:2024/05/29 16:46
题目描述
在数字串“3215125”中插入3个乘号,使总的乘积最大,不可以在头和尾放乘号,也不可在任两个相邻数间放多于一个乘号。
例如第一种插入乘号的方案:32*15*12*5 = 28800
第二种插入乘号的方案:3*215*12*5 = 38700
请输出最大的乘积。
无
输出格式输出最大的乘积
样例输入样例输出28800
#include <iostream>using namespace std;const int S[7] = {3,2,1,5,1,2,5};int main(){int d(int l, int r);int dd(int t, int r, int k);int ddd(int q, int r, int k);int P(int l, int r, int k);//测试函数模块d(已通过) //cout << "d(4, 4) = " << d(4, 4) << endl;//测试函数模块dd(已通过) //cout << "dd(4, 6, 3) = " << dd(4, 6, 3) << endl; //测试函数模块ddd(已通过) //cout << "ddd(4, 6, 3) = " << ddd(4, 6, 3) << endl; cout << P(0, 6, 3) << endl;return 0;}int d(int l, int r){int sum = 0;int sl = 1;for(int i = 0; i <= r - l; i++){sum = sum + S[r - i] * sl;sl = sl * 10;}return sum;}int dd(int t, int r, int k){t = t - 1; //函数形参不能用表达式,所以就用本式等价于形参是t+1 int d(int l, int r);int max = 0;for(int u = t + 1; u <= r - k + 2; u++){int a = d(t + 1, u) * d(u + 1, r);if(a > max)max = a;}return max;}int ddd(int q, int r, int k){q = q - 1; //同上一条注释,为弥补函数形参不能用表达式的缺陷 int d(int l, int r);int dd(int t, int r, int k);int max = 0;for(int t = q + 1; t <= r - k + 1; t++){int b = d(q + 1, t) * dd(t + 1, r, k);/*测试代码 cout << "当 q = " << q << "且 t = " << t << "时," << endl;cout << "d(q + 1, t) = " << d(q + 1, t) << endl;cout << "dd(t + 1, r, k) = " << dd(t + 1, r, k) << endl;cout << "b = " << b << endl;*/if(b > max)max = b;}return max;}int P(int l, int r, int k){int d(int l, int r);int dd(int t, int r, int k);int ddd(int q, int r, int k);int max = 0;for(int q = 0; q <= r - k; q++){int c = d(0, q) * ddd(q + 1, r, k);if(c > max)max = c;}return max;}
算法来自清华大学出版社《程序设计基础》第三版第253——256页的分析过程,但是书上的程序框图不能直接改写成代码,测试过程中有重大调整。
阅读全文
0 0
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(动态规划)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(递归法)
- MOOC清华《程序设计基础》第6章第2题:求f(a,b)问题(动态规划)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法一)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(动态规划,输出方法二)
- MOOC清华《程序设计基础》第6章:最长公共子序列问题(动态规划)
- MOOC清华《程序设计基础》第6章第1题:n级台阶问题(递推法)
- MOOC清华《程序设计基础》第6章第1题:n级台阶问题(递归法)
- MOOC清华《程序设计基础》第6章第2题:求f(a,b)问题(递归法)
- MOOC清华《程序设计基础》第4章第3题:不相同的个数(用筛法做)
- MOOC清华《程序设计基础》第6章:分鱼问题(不用数组递推)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(枚举法)
- MOOC清华《程序设计基础》第6章:橱窗插花问题(递推法)
- MOOC清华《程序设计基础》第5章:青蛙过河问题
- MOOC清华《程序设计基础》第1章第5题:银行存款问题
- MOOC清华《程序设计基础》第2章第5题:银行存款问题2
- MOOC清华《程序设计基础》第5章第2题:破损棋盘的八皇后问题
- MOOC清华《程序设计基础》第5章:快速排序(分配动态空间)
- window命令行
- 从零开始写设备树DTS
- 设计模式(11)--享元模式
- 翻译君Mobx,Ten minute introduction to MobX and React
- JVM调优:选择合适的GC collector (一)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(动态规划)
- [leetcode]310. Minimum Height Trees
- SpringMVC与ajax交互流程与实现
- 矩阵键盘
- POJ-3278 Catch that cow
- git学习------>从SVN迁移到Git之后,项目开发代码继续在SVN提交,如何同步迁移之后继续在SVN提交的代码到Git?
- Spring4.3+Hibernate5.2.10整合
- 数独-dfs
- java 实现二叉树【递归/非递归】