题解 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周年 ...
随机推荐
- windows 系统安装 IIS 以及配置 web
Win7系统或win8自带了IIS和framework,不需要单独去下载,只需要开启后就可以运行asp.net程序 由于时间关系,先分享两个关于这个的链接: win7安装iis及web配置教程 htt ...
- C# 在同一个项目里启动不同的类文件
比如有两个类文件分别为 Person.cs 和 Enum.cs : using System; using person; namespace HelloWorld { class HelloWorl ...
- ZOJ 1586 QS Network(Kruskal算法求解MST)
题目: In the planet w-503 of galaxy cgb, there is a kind of intelligent creature named QS. QScommunica ...
- django2.1---中间件
在http请求 到达视图函数之前 和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. Django1.9版本以后中间件的执行流程 1.执行完所有的requ ...
- 使用DateTime的ParseExact方法实现特殊日期时间的方法详解(转)
本篇文章是对使用DateTime的ParseExact方法实现特殊日期时间的方法进行了详细的分析介绍,需要的朋友参考下 今天遇到一个特别的需求,需要从下面的字符串中转换成一个DateTime对象: [ ...
- C# 获取config文件的值
自定义配置文件帮助类 利用ExeConfigurationFileMap类将自定义配置文件转换为Configuration类进行数据读取 代码很简单,就不做扼要说明 /// <summary&g ...
- 订阅 memcached: error while loading shared libraries: libevent-2.0.so.5: cannot o解决
memcached: error while loading shared libraries: libevent-2.0.so.5: cannot o解决 memcached基本选项 -p 端口 ...
- Firebird 手动安装 Legacy_Auth 登陆认证
下载官方发布的最新版本:V3.0.4 或者下载还没正式发布的下个版本(但已经修复了一些bug):V3.0.5 下载后解压缩,修改配置文件Firebird.conf的登陆认证为Legacy_Auth:这 ...
- c#基础学习(0709)之vs通过抽象方法实现多态
抽象类不能用来实例化对象 1.抽象类中可以有实例成员,也可以有抽象成员 2.抽象成员不能有任何实现 3.抽象类.抽象成员必须包含在抽象类中 4.抽象类不能用来实例化对象,既然抽象类不能被实例化,那么抽 ...
- BASE64转文件下载
你可以用HTML 5 注意:返回的文件数据必须是base 64编码的,因为您不能对二进制数据进行JSON编码 在我的AJAX我得到了如下的数据结构: <!DOCTYPE html> < ...