60 分,不知道咋搞的,帮我搞出来的,悬赏我的和我小号的关注。
#include <bits/stdc++.h>
using namespace std;
struct Bigint {
int f[107], len;
Bigint(int x = 0) {
memset(f, 0, sizeof(f));
for(len = 1; x; len++)
f[len] = x % 10, x /= 10;
len--;
}
inline void flatten(int x) {
len = x;
for(int i = 1; i <= len; i++) {
f[i + 1] += f[i] / 10;
f[i] %= 10;
}
while(!f[len]) len--;
}
inline void print() {
for(int i = max(len, 1); i >= 1; i--)
cout << f[i];
}
};
inline Bigint operator+(Bigint a, int b) {
Bigint c = a;
c.f[1] = c.f[1] + b;
c.flatten(a.len + 2);
return c;
}
inline Bigint operator*(Bigint a, Bigint b) {
Bigint c;
int mlen = a.len + b.len;
for(int i = 1; i <= a.len; i++)
for(int j = 1; j <= b.len; j++)
c.f[i + j - 1] += a.f[i] * b.f[j];
c.flatten(mlen + 30);
return c;
}
inline Bigint work(Bigint a) {
Bigint ans;
ans.len = a.len + 1;
for(int i = 2; i <= ans.len; i++)
ans.f[i] = a.f[i - 1];
ans.f[1] = 0;
return ans;
}
inline Bigint mx(Bigint a, Bigint b) {
if(a.len > b.len) return a;
if(a.len < b.len) return b;
for(int i = a.len; i >= 1; i++) {
if(a.f[i] > b.f[i]) return a;
if(a.f[i] < b.f[i]) return b;
}
return a;
}
int n, k, la;
char s[47];
Bigint dp[47][10];
Bigint a[47][47];
//dp[i][j] 表示在第 i 位,添加了 j 个乘号的最大乘积
inline Bigint value(int l, int r) {
Bigint num(0);
for(int i = l; i <= r; i++) {
int tmp = s[i] - '0';
num = work(num) + tmp;
}
return num;
}
int main() {
cin >> n >> k >> (s + 1);
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
a[i][j] = value(i, j);
for(int i = 1; i <= n; i++)
dp[i][0] = a[1][i];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= k; j++)
for(int l = 1; l < i; l++)
dp[i][j] = mx(dp[i][j], dp[l][j - 1] * a[l + 1][i]);
dp[n][k].print();
return 0;
}