题解 P1018 【乘积最大】
题目链接:P1018 乘积最大
题面
今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312, 当N=3,K=1时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
题意
在一个长度为 N 的数字字符串中加上 K 个乘号,使所得表达式值最大。
题解
前言: 洛谷数据加强了,用\(long long\)只有60分,我不讲高精度乘法,只讲如何解这道题。
由题中"可将它分成K+1个部分"得出,这是区间划分类的题目。
要求找出区间最大值,因为乘号放在任何一个位置都不一定是等效的结果,有子结构。
要求最大值也就是间接性求最优子结构,子结构最优后的得出总体最优。符合无后效性。
题面题意分析后可以得出这是一道区间划分DP题。
以加入的乘号数量作为划分阶段。
用 \(f[n][k]\) 表示原数字前 n 位中加入 k 个乘号所得表达式的最大值。
预处理出 \(a[i][j]\) 表示原数字第 i 位到第 j 位组成的数字。
\(f[n][k] = max(f[i][k-1] * a[i+1][n],i∈[k,n))\)
代码(无高精度)
#include<bits/stdc++.h>
using namespace std;
long long dp[45][45],num[45][45];
bool tong[45][45];
int n,k;
char ch[45];
inline void init()
{
cin >> n >> k;
cin >> ch;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
if(i <= j)
{
for(int k = i;k <= j;k++)
{
num[i][j]*=10;
num[i][j]+=ch[k]-'0';
}
}
}
}
}
long long dfs(int n,int k)
{
if(k == 0) return num[0][n-1];
if(tong[n-1][k-1]) return dp[n-1][k-1];
for(int i = k;i < n;i++)
dp[n-1][k-1] = max(dp[n-1][k-1],dfs(i,k-1)*num[i][n-1]);
tong[n-1][k-1] = true;
return dp[n-1][k-1];
}
int main(int argc, char const *argv[])
{
init();
cout << dfs(n,k);
getchar();getchar();getchar();
return 0;
}
有不懂的可以加我qq:2832853025
题解 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 乘积最大
开始定义状态f[i][j][k]为[i,j)区间插入k个括号,使用记忆化搜索,但是成功爆栈,得到4个mle #include <bits/stdc++.h> using namespace ...
- 洛谷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周年 ...
随机推荐
- [转]ASP.NET cache缓存的用法
本文转自:https://blog.csdn.net/mss359681091/article/details/51076712 本文导读:在.NET运用中经常用到缓存(Cache)对象.有HttpC ...
- 虚拟机VirtualBox安装
一.安装VirtualBox 下载地址:https://www.virtualbox.org/wiki/Downloads 一直点击下一步到结束就行了. 二.启动报错:“获取 VirtualBox C ...
- SSH框架搭建步骤总结以及Hibernate二级缓存,查询缓存
二级缓存.查询缓存 一级缓存: 默认启动,生命周期是和session同步的,session独享 二级缓存: 需要加载配置信息,生命周期是和应用服务器同步,session共享 1:在hibernate. ...
- NSObject常用方法和反射
// 类的反射 NSString *str = @"Person"; Class class = NSClassFromString(str); Pers ...
- 15、springboot访问html文件
在pom.xml加入 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...
- win10 系统下MyEclipse用SVN之后想切换用户的解决方法
1.在svn 创建了两类账户,分别是管理员 和 开发人员. 2.代码同步到Myecclipse .使用的是 admin 管理员账户checkout. 3.提交代码的时候想用开发者账户user提交,发现 ...
- Django基础六之ORM中的锁和事务
一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...
- sql中 设置区分大小写
CI 指定不区分大小写,CS 指定区分大小写alter table 表名 alter column 字段 nvarchar(100) collate chinese_prc_cs_as --区分大小写 ...
- js 和springboot内存图
- IIS测试环境搭建
1.控制面板->程序->程序和功能->打开或关闭Windows功能->Internet信息服务->Web管理工具,打开如下服务: 2.打开IIS管理器 2.1检查.net ...