题目描述
在数字串“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页的分析过程,但是书上的程序框图不能直接改写成代码,测试过程中有重大调整。