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
原创粉丝点击