题目链接: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分,我不讲高精度乘法,只讲如何解这道题。

  1. 由题中"可将它分成K+1个部分"得出,这是区间划分类的题目。

  2. 要求找出区间最大值,因为乘号放在任何一个位置都不一定是等效的结果,有子结构。

  3. 要求最大值也就是间接性求最优子结构,子结构最优后的得出总体最优。符合无后效性。

题面题意分析后可以得出这是一道区间划分DP题。

  1. 以加入的乘号数量作为划分阶段。

  2. 用 \(f[n][k]\) 表示原数字前 n 位中加入 k 个乘号所得表达式的最大值。

  3. 预处理出 \(a[i][j]\) 表示原数字第 i 位到第 j 位组成的数字。

  4. \(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 【乘积最大】的更多相关文章

  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 乘积最大

    开始定义状态f[i][j][k]为[i,j)区间插入k个括号,使用记忆化搜索,但是成功爆栈,得到4个mle #include <bits/stdc++.h> using namespace ...

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

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

  7. luogu P1018 乘积最大

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

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

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

  9. 洛谷—— P1018 乘积最大

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

随机推荐

  1. [转]ASP.NET cache缓存的用法

    本文转自:https://blog.csdn.net/mss359681091/article/details/51076712 本文导读:在.NET运用中经常用到缓存(Cache)对象.有HttpC ...

  2. 虚拟机VirtualBox安装

    一.安装VirtualBox 下载地址:https://www.virtualbox.org/wiki/Downloads 一直点击下一步到结束就行了. 二.启动报错:“获取 VirtualBox C ...

  3. SSH框架搭建步骤总结以及Hibernate二级缓存,查询缓存

    二级缓存.查询缓存 一级缓存: 默认启动,生命周期是和session同步的,session独享 二级缓存: 需要加载配置信息,生命周期是和应用服务器同步,session共享 1:在hibernate. ...

  4. NSObject常用方法和反射

    // 类的反射    NSString *str = @"Person";    Class class = NSClassFromString(str);        Pers ...

  5. 15、springboot访问html文件

    在pom.xml加入 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...

  6. win10 系统下MyEclipse用SVN之后想切换用户的解决方法

    1.在svn 创建了两类账户,分别是管理员 和 开发人员. 2.代码同步到Myecclipse .使用的是 admin 管理员账户checkout. 3.提交代码的时候想用开发者账户user提交,发现 ...

  7. Django基础六之ORM中的锁和事务

    一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...

  8. sql中 设置区分大小写

    CI 指定不区分大小写,CS 指定区分大小写alter table 表名 alter column 字段 nvarchar(100) collate chinese_prc_cs_as --区分大小写 ...

  9. js 和springboot内存图

  10. IIS测试环境搭建

    1.控制面板->程序->程序和功能->打开或关闭Windows功能->Internet信息服务->Web管理工具,打开如下服务: 2.打开IIS管理器 2.1检查.net ...