P1018 乘积最大
开始定义状态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 乘积最大的更多相关文章
- P1018 乘积最大(高精度加/乘)
P1018 乘积最大 一道dp题目.比较好像的dp题目. 然而他需要高精度计算. 所以,他从我开始学oi,到现在.一直是60分的状态. 今天正打算复习模板.也就有借口解决了这道题目. #include ...
- 洛谷 P1018 乘积最大
P1018 乘积最大 题目描述 今年是国际数学联盟确定的“ 20002000 ――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 9090 周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学 ...
- P1018 乘积最大(DP)
题目 P1018 乘积最大 解析 区间DP 设\(f[i][j]\)表示选\(i\)个数,插入\(j\)个乘号时的最大值 设\(num[i][j]\)是\(s[i,j]\)里的数字 转移方程就是\(f ...
- Luogu - P1018 乘积最大 - 题解
原文:https://www.luogu.org/problemnew/solution/P1018?page=7 题目:P1018[乘积最大] 前言: 这题的正解理论上说是DP,可是由于民间数据太水 ...
- 洛谷P1018乘积最大——区间DP
题目:https://www.luogu.org/problemnew/show/P1018 区间DP+高精,注意初始化和转移的细节. 代码如下: #include<iostream> # ...
- luogu P1018 乘积最大
题目描述 今年是国际数学联盟确定的"2000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...
- [NOIP2000] 提高组 洛谷P1018 乘积最大
题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...
- 洛谷—— P1018 乘积最大
https://www.luogu.org/problem/show?pid=1018#sub 题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年 ...
- 洛谷 P1018乘积最大
题目描述 今年是国际数学联盟确定的“20002000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰9090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 ...
- java实现 洛谷 P1018 乘积最大
import java.math.BigInteger; import java.util.Scanner; public class Main { private static Scanner ci ...
随机推荐
- hdu 1757 矩阵快速幂 **
一看正确率这么高,以为是水题可以爽一发,结果是没怎么用过的矩阵快速幂,233 题解链接:点我 #include<iostream> #include<cstring> ; us ...
- hdu 1515 dfs
一道不错的搜索题 题意:告诉你两个字符串a和b,要求对a进行栈的操作而产生b串,输出操作的顺序,如果有多组输出就按字典序输出. Sample Input madam adamm bahama baha ...
- ML 02、监督学习
机器学习算法原理.实现与实践——监督学习 机器学习包括监督学习.非监督学习.半监督学习及强化学习,这里先讨论监督学习. 监督学习的任务是学习一个模型,使模型能够对任意给定的输入,对其相应的输出做出一个 ...
- Codeforces Round #360 (Div. 2) E. The Values You Can Make DP
E. The Values You Can Make Pari wants to buy an expensive chocolate from Arya. She has n coins, ...
- Android 贝塞尔曲线 折线图
1.贝塞尔曲线:http://baike.baidu.com/view/60154.htm,在这里理解什么是贝塞尔曲线 2.直接上图: 3.100多行代码就可以画出贝塞尔曲线,直接上代码 packag ...
- Oracle基本常用命令
一.ORACLE的启动和关闭 1.在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a.启动ORACLE系统 oracle>svrmgrl ...
- cocos2d 多点触控
#ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" USING_N ...
- [Cocos2d-x For WP8]Menu菜单
菜单栏这是游戏里面基本的控件来的, 头文件: #include <CCMenu.h> 继承关系图: 头文件: #include < ...
- [Unity2D]实现背景的移动
在游戏中通常会实现的效果是玩家主角移动的时候,背景也可以跟着移动,要实现这种效果其实就是获取主角的位置,然后再改变摄像机的位置就可以了,这就需要通过脚本来实现.这个脚本添加到摄像机的GameObjec ...
- 【BZOJ】1027: [JSOI2007]合金(凸包+floyd)
http://www.lydsy.com/JudgeOnline/problem.php?id=1027 题意:$n$种材料,$m$种需求.每种材料有三个属性,给出三个属性的含量(和为1),问能否通过 ...