P1018 乘积最大(dp)

P1018 乘积最大

https://www.luogu.com.cn/problem/P1018
不得不说python的码量……这题C++高精真的很麻烦,先埋下一个C++高精的坑

题意:
有一个长度为 N N N的数字串,要求选手使用 K K K个乘号将它分成 K + 1 K+1 K+1个部分,找出一种分法,使得这 K + 1 K+1 K+1个部分的乘积能够为最大。
输入
4 2
1231
输出
62

思路:
dp。 d p [ i ] [ k ] dp[i][k] dp[i][k]表示前 i i i个数放 k k k个乘号的最大值,那么它是由 k − 1 k-1 k1个乘号的所有状态转移过来的。

Code:

N, K = map(int, input().split())
s = input()
# 二维数组dp[N][K],dp[i][K]前i个数字放k个乘号的最大乘积
dp = [[0 for i in range(K + 1)] for j in range(N + 1)]
# 初始化,前i个数字放0个乘号
for i in range(1, N + 1):
    dp[i][0] = int(s[0: i])
for k in range(1, K + 1):  # k个乘号
    for i in range(k + 1, N + 1):  # 前i个数
        for j in range(k, i):  # 最后一个乘号的位置
            dp[i][k] = max(dp[i][k], dp[j][k - 1] * int(s[j:i]))
print(dp[N][K])

你可能感兴趣的:(动态规划)