#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define REP(i, a, b) for (int i = (a), i##_end_ = (b); i < i##_end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()))
#define ALL(x) (x).begin(), (x).end()
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
typedef long long LL;
int n,p,a[50],g[50][50];
long long f[50][10];
int main()
{
scanf("%d%d",&n,&p);
for (int i=1;i<=n;i++) scanf("%1d",&a[i]);
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++)
g[i][j] = g[i][j-1] * 10 + a[j];
for (int i=1;i<=n;i++) f[i][0] = f[i-1][0] * 10 + a[i];
for (int k=1;k<=p;k++)
for (int i=k+1;i<=n;i++)
for (int j=k;j<i;j++)
f[i][k] = max(f[i][k],f[j][k-1] * g[j+1][i]);
// 状态转移方程用到了 f[j][k-1]
// 即 每一个状态 需要由 " 计算用更少的乘号 给区间得到的最优值 "
// 所以在最外层枚举用到的乘号个数
// 保证 计算每一个 f 值 ,用到的其他 f 值都已经计算过
printf("%lld", f[n][p]);
return 0;
}
动态规划 - 区间DP - NOIP 乘积最大
最新推荐文章于 2022-02-15 23:53:19 发布