题意:将一个长为N的数,用K个乘号隔开,输出最大乘积。
题解:这道题可以用深搜,动规和递归,我用的是递归。众所周知,递归是将大问题化为可以解决的小问题即出口。我的递归函数是将一个字符串用substr切成两部分,再递归第二部分,最后返回当前数字用K(K每次减一)个乘号分割的最大乘积。当然,两个字符串长度是要枚举的。如下:
函数:string res(int n,int k,string data)
数字:res(5, k, "abcde") >> a * res(4, --k, "bcde") >> ab * res(3, --k, "cde")
>> abc *res(2, --k, "de") >> ......以此类推
这道题答案超long long ,所以要用高精。高精思路就是乘法竖式。
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, k;
string data;
string times(string, string);
string res(string, int, int);
int main()
{
cin >> n >> k >> data;
cout << res(data, n, k);
}
string times(string a,string b)
{
if(a == "0" || b == "0")
return "0";
int size_a = a.size(), size_b = b.size(), rem = 0, ans[81];
int a_l[41], b_l[41];
char tmp;
bool flag = false;
string out = "";
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
memset(a_l, 0, sizeof a_l);
memset(b_l, 0, sizeof b_l);
memset(ans, 0, sizeof ans);
for(int i = 0; i < size_a; i++) a_l[i + 1] = a[i] - '0';
for(int i = 0; i < size_b; i++) b_l[i + 1] = b[i] - '0';
for(int i = 1; i <= size_b; i++)
{
for(int j = 1; j <= size_a; j++)
{
ans[i + j - 1] += a_l[j] * b_l[i];
}
}
for(int i = 1; i <= size_a + size_b - 1; i++)
{
ans[i+1] += ans[i] / 10;
ans[i] %= 10;
}
for(int i = 1;i <= size_a + size_b;i++)
{
tmp = ans[i] + '0';
out = tmp + out;
}
if(out[0] == '0')
out = out.substr(1);
return out;
}
string res(string data,int len,int num)
{
string tot = "0";
if(num == 0)
return data;
for(int i = 1; i < len - num + 1; i++)
{
string head = data.substr(0,i);
string tail = data.substr(i);
if(head[0] == '0' || tail[0] == '0') continue;
string rem = times(head, res(tail,len - i,num - 1));
if(rem.size() > tot.size() || rem.size() == tot.size() && rem > tot)
tot = rem;
}
return tot;
}