题目链接: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. Web 后端--PHP 与数据库的交互

    网页要处理数据,数据置于数据库之中.今天看了书,不能让知识遗忘,遂及时记下. 用 PHP  操作 MySQL ,实现数据的交换,还要多练练.... PS: 以下 mysql 字段与mysqli 字段皆 ...

  2. 【转】CSS3的calc()使用——精缩版

    问题:在制作页面的时候,总会碰到有的元素是100%的宽度.如果元素宽度是100%时,只要在元素中添加了border,padding,margin任何一值,都将会把元素盒子撑破(标准模式下,除IE怪异模 ...

  3. HttpContext概念讲解

    一:HttpContext理论知识: 1:HttpContext类它对Request.Respose.Server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用:为继承 IHttpMod ...

  4. C# 中 NPOI 库读写 Excel 文件的方法【摘】

    原作:淡水网志 NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件.在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx.官网提供了一份 Exa ...

  5. 数组的strong copy理解

      一.数组的不同情况下的copy,mutablecopy分析 1.不可变数组的copy(没有创建新对象,复制的只是指针)       2.不可变数组的mutable copy(创建新对象)     ...

  6. 1.1 JAVA装箱和拆箱以及Java Number & Math&Character 类

    JAVA装箱和拆箱 从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了.原文链接: http://www.cnblogs.com/dolph ...

  7. 关于JqueryCheck选中获取数据

    关于Jquery获取Check选中数据 首先还是得引用Jquery的包,然后新增3个CheckBox <div> <input type="checkbox" n ...

  8. PHPCMS v9上传图片提示"undefined"的解决办法

    把phpcms\modules\attachment\attachments.php中将 if(empty($this->userid)){改成 if(empty($_POST['userid' ...

  9. egg.js-基于koa2的node.js进阶(一)

    一.路由进阶Egg路由的路由重定向,路由分组 在router.js修改为如下格式require引用 module.exports = app => { const { router, contr ...

  10. JavaScript 常见面试题

    此文内容多为 JavaScript 对数组理解及运用. 1.如何消除一个数组里面重复的元素? var arr = [1, 2, 3, 3, 4, 4, 5, 5, 6, 1]; var newArr ...