6-3
(2/2 分数)
题目描述
在数字串“3215125”中插入3个乘号,使总的乘积最大,不可以在头和尾放乘号,也不可在任两个相邻数间放多于一个乘号。
例如第一种插入乘号的方案:32*15*12*5 = 28800
第二种插入乘号的方案:3*215*12*5 = 38700
请输出最大的乘积。
无
输出格式输出最大的乘积
样例输入样例输出
28800代码框
先用穷举法写了一下,居然测试通过了......
#include <iostream>
using namespace std;
int main(){
char a[8]="3215125";
int b[7];
for(int i=0;i<7;i++){
b[i]=a[i]-'0';
}
int max=0;
for(int i=0;i<4;i++){
for(int j=i+1;j<5;j++){
int x=0;
for(int w=0;w<j;w++)
x=x*10+b[w];
for(int k=j+1;k<6;k++){
int y=0;
for(int e=j;e<k;e++)
y=y*10+b[e];
int l=k+1;
for(l=k+1;l<7;l++){
int z=0;
for(int r=k;r<l;r++){
z=z*10+b[r];
int m=0;
for(int q=r+1;q<7;q++)
m=m*10+b[q];
if(max<x*y*z*m) {
max=x*y*z*m;
}
}
}
}
}
}
cout<<max<<endl;
return 0;
}
然后找了一下,看能不能用动态规划的方法,也尝试写了一下
#include <iostream>
#include <cmath>
using namespace std;
//f(i,k) 前i个数字插入k个*号的最大值
//一般地,为了求取f(i,k),考察数字串的前i个数字,设前j(k<=j<i)个数字中已插入k-1个乘号的基础上,
//在第j个数字后插入第t个乘号,显然此时的最大乘积为f(j,k-1)*a(j+1,i) a(j+1,i)对应的是j+1到i的字符串
//于是可以得递推关系式:f(i,k)=max(f(j,k-1)*a(j+1,i)) (k<=j<i)
int main(){
char s[8]="3215125";
int temp=0;
int f[8][4]={0}; //7个数字插入3个*
int b[7];
//将字符串中的每个数字转化为数字保存
for(int i=0;i<7;i++)
b[i]=s[i]-'0';
for(int i=1;i<=7;i++){
temp=temp*10+b[i-1];
f[i][0]=temp; //计算初始值f[i][0]
}
for(int k=1;k<=3;k++)
for(int i=k+1;i<=7;i++)
for(int j=k;j<i;j++){
temp=0;
for(int u=j+1;u<=i;u++){
temp=temp*10+b[u-1]; //temp是第k-1个乘号到第i个字符中间的那串数字
}
if(f[i][k]<f[j][k-1]*temp){
f[i][k]=f[j][k-1]*temp;
}
}
cout<<f[7][3]<<endl;
return 0;
}