思路 :定义一个二维数组
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j],代表在第i个字符后插入第j个乘号取得的最大乘积。状态转移:
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
]
[
j
]
,
d
p
[
i
−
1
]
[
l
]
∗
s
u
m
)
dp[i][j] = max(dp[i][j], dp[i - 1][l] * sum)
dp[i][j]=max(dp[i][j],dp[i−1][l]∗sum)
遍历
l
l
l。
在其他的oj可以过,但是在洛谷过不了,洛谷的数据比较强,需要用到高精度存 d p dp dp,这里的代码是非高精度的,博主太懒了,如果想过洛谷的话自己加个高精度乘法吧。
#include "bits/stdc++.h"
using namespace std;
#define int long long
const int maxn = 1e3;
int fast(int a, int n) {
int base = a, res = 1;
while (n) {
if (n & 1)res *= base;
base *= base;
n >>= 1;
}
return res;
}
int a[maxn];
int dp[maxn][maxn];
int fun(int l, int r) {
int sum = 0;
for (int i = l; i <= r; i++) {
sum += a[i];
sum *= 10;
}
return sum / 10;
}
signed main() {
// int n = fast(2,19);
// cout<<fast(2,19)<<endl;
// int sum = 0;
// for(int i = 19;i>=0;i--)
// {
// sum += 1<<i;
// cout<<sum<<endl;
// }
int n, k;
cin >> n >> k;
string ss;
cin >> ss;
for (int i = 1; i <= n; i++)
a[i] = ss[i - 1] - '0';
for (int i = 1; i <= n; i++) {
int j = 1;
int sum = 0;
while (j <= i) {
sum += a[j];
sum *= 10;
j++;
}
sum /= 10;
dp[1][i] = sum;
}
for (int i = 2; i <= k; i++) {
for (int j = i; j <= n; j++) {
for (int l = i - 1; l < j; l++) //1-l,l + 1-j;
{
int sum = 0;
sum = fun(l + 1, j);
dp[i][j] = max(dp[i][j], dp[i - 1][l] * sum);
}
}
}
int ans = 0;
for (int i = k; i < n; i++) {
ans = max(ans, dp[k][i] * fun(i + 1, n));
}
cout << ans << endl;
return 0;
}