题目描述

今年是国际数学联盟确定的“20002000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰9090周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZXZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:

设有一个长度为NN的数字串,要求选手使用KK个乘号将它分成K+1K+1个部分,找出一种分法,使得这K+1K+1个部分的乘积能够为最大。

同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:

有一个数字串:312312, 当N=3,K=1N=3,K=1时会有以下两种分法:

1、3 \times 12=363×12=36 2、31 \times 2=6231×2=62

这时,符合题目要求的结果是: 31 \times 2 = 6231×2=62

现在,请你帮助你的好朋友XZXZ设计一个程序,求得正确的答案。

输入输出格式

输入格式:

程序的输入共有两行:

第一行共有22个自然数N,KN,K(6≤N≤40,1≤K≤66≤N≤40,1≤K≤6)

第二行是一个长度为NN的数字串。

输出格式:

结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数)。

输入输出样例

输入样例#1: 复制

4  2
1231

输出样例#1: 复制

62

分析:

一个很明显的dp问题,但是数字因为结果数字太大,所以要用到大数类,就是Biginteger。

我开辟了一个二维数组 res[k+1][len+1] ,其中 k+1 是用到了几个乘号,len 就是记录最后一个数字的位置。

动态转移方程很简单:dp[n][m]=Math.max(dp[n][m],dp[n-1][m]*最后一个要乘的数字);

代码:

 1 import java.math.BigInteger;
 2 import java.util.Scanner;
 3
 4 public class Main {
 5     public static void main(String args[]) {
 6         Scanner sc=new Scanner(System.in);
 7         int num=sc.nextInt();
 8         int k=sc.nextInt();
 9         String str=sc.next();
10         int len=str.length();
11         BigInteger[][] res=new BigInteger[k+1][len+1];
12         for(int n=1;n<=len;++n)
13             res[0][n]=new BigInteger(str.substring(0,n));
14         for(int i=1;i<=k;++i)
15             for(int j=1;j<=len;++j)
16                 for(int n=j-1;n>0;--n) {
17                     if(res[i-1][n]==null)
18                         continue;
19                     BigInteger b=new BigInteger(str.substring(n,j));
20                     BigInteger r=res[i-1][n].multiply(b);
21                     if(res[i][j]==null)
22                         res[i][j]=r;
23                     else
24                         res[i][j]=res[i][j].max(r);
25                 }
26         System.out.print(res[k][len]);
27     }
28 }

其中有一个判定大数为空的话,就直接跳过的if语句。首先开辟的大数数组和int数组是一样的,他的初始值不是0而是null,所以如果你不给他赋值的话他就是null,是无法计算的。

如果当前数组位置为null的话,就说明不会有这种情况,比如res[2][1],你只有长度为1的数字,是无论如何也无法用两个乘号去运算的,所以直接跳过就可以了,不必纠结。

转载于:https://www.cnblogs.com/CHAHA123/p/10820799.html

洛谷 P1018乘积最大相关推荐

  1. 洛谷P1018乘积最大题解--zhengjun

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

  2. 洛谷——P1887 乘积最大3

    P1887 乘积最大3 题目描述 请你找出 MMM 个和为 NNN 的正整数,他们的乘积要尽可能的大. 输出字典序最小的一种方案. 输入格式 一行,两个正整数 N,MN,MN,M 输出格式 MMM 个 ...

  3. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  4. 洛谷刷题C语言:【Mc生存】经验值、开灯、乘积最大3、三角函数、电梯里的爱情

    记录洛谷刷题QAQ 一.[Mc生存]经验值 题目背景 初一福利第2弹... 题目描述 话说 clearman 在 MC 世界开了个祥艺奶牛场,用熔浆.TNT 等丧心病狂的折磨牛,获取牛肉.牛奶等刷经验 ...

  5. java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...

    点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...

  6. [洛谷P1074] 靶形数独

    洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...

  7. 信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环

    [题目链接] ybt 1933:[05NOIP普及组]循环 洛谷 P1050 [NOIP2005 普及组] 循环 [题目考点] 1.高精度 2.数学 [解题思路] 要求最后k位的循环长度,可以从低位向 ...

  8. 信息学奥赛一本通 1910:【00NOIP普及组】计算器的改良 | 洛谷 P1022 [NOIP2000 普及组] 计算器的改良

    [题目链接] ybt 1910:[00NOIP普及组]计算器的改良 洛谷 P1022 [NOIP2000 普及组] 计算器的改良 [题目考点] 1. 字符数组 2. 一元一次方程 3. 模拟 [解题思 ...

  9. 洛谷 P1080 国王游戏

    这是一道贪心题,贪心的策略是将大臣们按左右手金币的乘积升序排列,具体证明过程可以参见洛谷大佬的题解,这里就不再赘述了. 因为本菜鸡之前没有接触过高精度运算,对C++的运算符重载也不太熟练,所以正好借此 ...

最新文章

  1. Ueditor和CKeditor 两款编辑器的使用与配置
  2. 春运渡劫!Python给我抢回家的火车票
  3. 正则表达式(基础、常用)----JavaScript
  4. PAFF 和MBAFF
  5. md5只是用来签名,签名的作用是保证数据完整不会被破坏而已。签名和加密是两回事...
  6. 如何用Python实现股票量化交易?
  7. 会议OA项目之我的审批功能
  8. T83310 【音乐会】二重变革
  9. (笔记)集成电路作用解释(杂乱无章,等待质变)
  10. 各国时区夏令时切换信息
  11. 怎么看曲线有没有斜渐近线_关于曲线的斜渐近线
  12. 大数据毕设 - 校园卡数据分析与可视化(python 大数据)
  13. uniapp 打包安卓 Android 抖音app 前后端调试篇~03
  14. sctp 编程接口指南
  15. Oracle 11g数据库安装之后无OracleOraDb11g_home1TNSListener服务
  16. pywin32/win32com批量转格式doc/docx/pdf/html/python-docx批量修改Word文档内容和格式
  17. Alios things内核篇三:内存管理
  18. 端口扫描工具—Zenmap
  19. 常用七种排序之冒泡排序(排序图解+分析Java
  20. 人人都有独立站 跨境出海必须了解的竞争策略有哪些

热门文章

  1. NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」
  2. MS Lync2010客户端开发体会
  3. 免费的.NET混淆和反编译工具
  4. functionclass[LeetCode]Path Sum II
  5. 客服顾问的工具箱--走出软件作坊:三五个人十来条枪 如何成为开发正规军(六)[转]...
  6. AUTOSAR从入门到精通100讲(125)-详解车载网络 OTA系统的开发
  7. AUTOSAR从入门到精通100讲(五)-汽车LIN总线详解
  8. Python应用实战- 爬虫基础入门知识必会
  9. php mk的支持扩展,Linux部署Redis及PHP-redis扩展
  10. linux统计字符串频数,Linux 统计某个字符串出现的次数