开始定义状态f[i][j][k]为[i,j)区间插入k个括号,使用记忆化搜索,但是成功爆栈,得到4个mle

#include <bits/stdc++.h>
using namespace std;
const int maxn = 45;
int n, k, len;
long long f[maxn][maxn][maxn];
char str[maxn];
int trans(int l, int r){
int x = 0;
for(int i = l; i <= r; i++) {
x = x * 10 + str[i] - '0';
}
return x;
}
int dp(int left, int right, int cur) {
if(cur <= 0) return f[left][right][cur] = trans(left, right);
if(f[left][right][cur]) return f[left][right][cur];
int m, ans = 0;
for(m = left; m <= right; m++) {
for(int c = 0; c <= cur; c++) {
ans = max(ans, dp(left, m, c) * dp(m+1, right, cur-c));
}
}
return ans;
}
int main() {
cin >> n >> k;
scanf("%s", str);
len = strlen(str);
memset(f, 0, sizeof(f));
cout << dp(0, len-1, k);
}

后来重新思考(看题解),发现定义f[i][j]为前i个元素插入j个括号会更好,而且这样状态的转移就有了顺序,我们有方程:

f[i][j] = max(f[i][j], f[k][j-1]*trans(k,i)

这样,状态数O(n2),转移O(n)复杂度O(n3);

#include <bits/stdc++.h>
using namespace std;
const int maxn = 45;
int n, k, len;
long long f[maxn][maxn];
char str[maxn];
long long g[maxn][maxn];
long long trans(int l, int r){
if(g[l][r]) return g[l][r];
long long x = 0;
for(int i = l; i <= r; i++) {
x = x * 10 + str[i] - '0';
}
return g[l][r] = x;
}
int main() {
cin >> n >> k;
scanf("%s", str);
len = strlen(str);
memset(f, 0, sizeof(f));
for(int i = 0; i < n; i++) {
f[i][0] = trans(0, i);
}
for(int j = 1; j <= k; j++) {
for(int i = 0; i < n; i++) {
long long maxx = 0;
for(int k = i; k >= j; k--) {
maxx = max(maxx, f[k-1][j-1] * trans(k,i));
}
f[i][j] = maxx;
}
}
cout << f[n-1][k];
}

P1018 乘积最大的更多相关文章

  1. P1018 乘积最大(高精度加/乘)

    P1018 乘积最大 一道dp题目.比较好像的dp题目. 然而他需要高精度计算. 所以,他从我开始学oi,到现在.一直是60分的状态. 今天正打算复习模板.也就有借口解决了这道题目. #include ...

  2. 洛谷 P1018 乘积最大

    P1018 乘积最大 题目描述 今年是国际数学联盟确定的“ 20002000 ――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 9090 周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学 ...

  3. P1018 乘积最大(DP)

    题目 P1018 乘积最大 解析 区间DP 设\(f[i][j]\)表示选\(i\)个数,插入\(j\)个乘号时的最大值 设\(num[i][j]\)是\(s[i,j]\)里的数字 转移方程就是\(f ...

  4. Luogu - P1018 乘积最大 - 题解

    原文:https://www.luogu.org/problemnew/solution/P1018?page=7 题目:P1018[乘积最大] 前言: 这题的正解理论上说是DP,可是由于民间数据太水 ...

  5. 洛谷P1018乘积最大——区间DP

    题目:https://www.luogu.org/problemnew/show/P1018 区间DP+高精,注意初始化和转移的细节. 代码如下: #include<iostream> # ...

  6. luogu P1018 乘积最大

    题目描述 今年是国际数学联盟确定的"2000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...

  7. [NOIP2000] 提高组 洛谷P1018 乘积最大

    题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...

  8. 洛谷—— P1018 乘积最大

    https://www.luogu.org/problem/show?pid=1018#sub 题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年 ...

  9. 洛谷 P1018乘积最大

    题目描述 今年是国际数学联盟确定的“20002000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰9090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 ...

  10. java实现 洛谷 P1018 乘积最大

    import java.math.BigInteger; import java.util.Scanner; public class Main { private static Scanner ci ...

随机推荐

  1. 如何从本地把项目上传到github

    在本地项目所在目录按以下步骤操作 echo # test >> README.md git init git add README.md git add . git commit -m . ...

  2. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  3. (六)WebRTC手记之WebRtcVideoEngine2模块

    转自:http://www.cnblogs.com/fangkm/p/4401143.html 终于讲到视频数据的编码发送模块了,不容易.总体来说也看了不少时间WebRTC的源码了,最大的感触就是各个 ...

  4. python logging用法

    import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(line ...

  5. DP ZOJ 3872 Beauty of Array

    题目传送门 /* DP:dp 表示当前输入的x前的包含x的子序列的和, 求和方法是找到之前出现x的位置(a[x])的区间内的子序列: sum 表示当前输入x前的所有和: a[x] 表示id: 详细解释 ...

  6. C# params参数的应用

    为了将方法声明为可以接受可变数量参数的方法,我们可以使用params关键字来声明数组,如下所示: public static Int32Add(params Int32[] values) { Int ...

  7. jsp 将html字符串输出html标签

    第一种: <% out.println("<table><tr><td></td></tr></table>&q ...

  8. iOS移动开发周报-第25期

    iOS移动开发周报-第25期 [摘要]:本期iOS移动开发周报带来如下内容:苹果发布 iPhone6 和 Apple Watch.Swift 1.0 GM发布.Xcode 6支持PDF Vector作 ...

  9. 4.用文本编辑器输入课堂上练习的Hello.java,并在JDK环境下编译和运行。请将程序编译、运行的结果截图,填入下框中。

    一开始报错是因为在文本框了的:用的是中文下的,应该用英文下的;

  10. _jobdu_1384:二维数组中的查找

    /************************************************************************/ /* 题目描述: 在一个二维数组中,每一行都按照从 ...