链接:https://ac.nowcoder.com/acm/contest/1072/L?&headNav=acm&headNav=acm

来源:牛客网

乘积最大

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 262144K,其他语言524288K

64bit IO Format: %lld

题目描述

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

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

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

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

  1. 3*12=36
  2. 312=62

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

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

    输入描述:

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

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

    输出描述:

    输出所求得的最大乘积(一个自然数)。

    示例1

    输入

    复制

    4 2

    1231

    输出

    复制

    62

思路:

定义dp状态为 dp[i][j] 代表 到第i个数字,用了j个乘号,获得的最大乘积。

由于长度是40,所以肯定是会爆longlong的,用大数模板即可。

细节见代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #include <stack>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <iomanip>
  12. #define ALL(x) (x).begin(), (x).end()
  13. #define sz(a) int(a.size())
  14. #define all(a) a.begin(), a.end()
  15. #define rep(i,x,n) for(int i=x;i<n;i++)
  16. #define repd(i,x,n) for(int i=x;i<=n;i++)
  17. #define pii pair<int,int>
  18. #define pll pair<long long ,long long>
  19. #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
  20. #define MS0(X) memset((X), 0, sizeof((X)))
  21. #define MSC0(X) memset((X), '\0', sizeof((X)))
  22. #define pb push_back
  23. #define mp make_pair
  24. #define fi first
  25. #define se second
  26. #define eps 1e-6
  27. #define gg(x) getInt(&x)
  28. #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
  29. using namespace std;
  30. typedef long long ll;
  31. ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
  32. ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
  33. ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
  34. inline void getInt(int* p);
  35. const int maxn = 1000010;
  36. const int inf = 0x3f3f3f3f;
  37. /*** TEMPLATE CODE * * STARTS HERE ***/
  38. const int MAXN=50;
  39. struct bign
  40. {
  41. int len, s[MAXN];
  42. bign ()
  43. {
  44. memset(s, 0, sizeof(s));
  45. len = 1;
  46. }
  47. bign (int num) { *this = num; }
  48. bign (const char *num) { *this = num; }
  49. bign operator = (const int num)
  50. {
  51. char s[MAXN];
  52. sprintf(s, "%d", num);
  53. *this = s;
  54. return *this;
  55. }
  56. bign operator = (const char *num)
  57. {
  58. for(int i = 0; num[i] == '0'; num++) ; //去前导0
  59. len = strlen(num);
  60. for(int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';
  61. return *this;
  62. }
  63. bign operator + (const bign &b) const //+
  64. {
  65. bign c;
  66. c.len = 0;
  67. for(int i = 0, g = 0; g || i < max(len, b.len); i++)
  68. {
  69. int x = g;
  70. if(i < len) x += s[i];
  71. if(i < b.len) x += b.s[i];
  72. c.s[c.len++] = x % 10;
  73. g = x / 10;
  74. }
  75. return c;
  76. }
  77. bign operator += (const bign &b)
  78. {
  79. *this = *this + b;
  80. return *this;
  81. }
  82. void clean()
  83. {
  84. while(len > 1 && !s[len-1]) len--;
  85. }
  86. bign operator * (const bign &b) //*
  87. {
  88. bign c;
  89. c.len = len + b.len;
  90. for(int i = 0; i < len; i++)
  91. {
  92. for(int j = 0; j < b.len; j++)
  93. {
  94. c.s[i+j] += s[i] * b.s[j];
  95. }
  96. }
  97. for(int i = 0; i < c.len; i++)
  98. {
  99. c.s[i+1] += c.s[i]/10;
  100. c.s[i] %= 10;
  101. }
  102. c.clean();
  103. return c;
  104. }
  105. bign operator *= (const bign &b)
  106. {
  107. *this = *this * b;
  108. return *this;
  109. }
  110. bign operator - (const bign &b)
  111. {
  112. bign c;
  113. c.len = 0;
  114. for(int i = 0, g = 0; i < len; i++)
  115. {
  116. int x = s[i] - g;
  117. if(i < b.len) x -= b.s[i];
  118. if(x >= 0) g = 0;
  119. else
  120. {
  121. g = 1;
  122. x += 10;
  123. }
  124. c.s[c.len++] = x;
  125. }
  126. c.clean();
  127. return c;
  128. }
  129. bign operator -= (const bign &b)
  130. {
  131. *this = *this - b;
  132. return *this;
  133. }
  134. bign operator / (const bign &b)
  135. {
  136. bign c, f = 0;
  137. for(int i = len-1; i >= 0; i--)
  138. {
  139. f = f*10;
  140. f.s[0] = s[i];
  141. while(f >= b)
  142. {
  143. f -= b;
  144. c.s[i]++;
  145. }
  146. }
  147. c.len = len;
  148. c.clean();
  149. return c;
  150. }
  151. bign operator /= (const bign &b)
  152. {
  153. *this = *this / b;
  154. return *this;
  155. }
  156. bign operator % (const bign &b)
  157. {
  158. bign r = *this / b;
  159. r = *this - r*b;
  160. return r;
  161. }
  162. bign operator %= (const bign &b)
  163. {
  164. *this = *this % b;
  165. return *this;
  166. }
  167. bool operator < (const bign &b)
  168. {
  169. if(len != b.len) return len < b.len;
  170. for(int i = len-1; i >= 0; i--)
  171. {
  172. if(s[i] != b.s[i]) return s[i] < b.s[i];
  173. }
  174. return false;
  175. }
  176. bool operator > (const bign &b)
  177. {
  178. if(len != b.len) return len > b.len;
  179. for(int i = len-1; i >= 0; i--)
  180. {
  181. if(s[i] != b.s[i]) return s[i] > b.s[i];
  182. }
  183. return false;
  184. }
  185. bool operator == (const bign &b)
  186. {
  187. return !(*this > b) && !(*this < b);
  188. }
  189. bool operator != (const bign &b)
  190. {
  191. return !(*this == b);
  192. }
  193. bool operator <= (const bign &b)
  194. {
  195. return *this < b || *this == b;
  196. }
  197. bool operator >= (const bign &b)
  198. {
  199. return *this > b || *this == b;
  200. }
  201. string str() const
  202. {
  203. string res = "";
  204. for(int i = 0; i < len; i++) res = char(s[i]+'0') + res;
  205. return res;
  206. }
  207. };
  208. istream& operator >> (istream &in, bign &x)
  209. {
  210. string s;
  211. in >> s;
  212. x = s.c_str();
  213. return in;
  214. }
  215. ostream& operator << (ostream &out, const bign &x)
  216. {
  217. if (x.str()=="") out<<0;
  218. else out << x.str();
  219. return out;
  220. }
  221. string a;
  222. int n,k;
  223. bign dp[41][7];
  224. bign temp;
  225. int main()
  226. {
  227. //freopen("D:\\code\\text\\input.txt","r",stdin);
  228. //freopen("D:\\code\\text\\output.txt","w",stdout);
  229. gbtb;
  230. cin>>n>>k>>a;
  231. a="0"+a;
  232. for(int i=1;i<=n;++i)
  233. {
  234. for(int j=0;j<=k;j++)
  235. {
  236. dp[i][j]=0;
  237. }
  238. }
  239. for(int i=0;i<=k;++i)
  240. {
  241. dp[0][i]=1;
  242. }
  243. for(int i=1;i<=n;++i)
  244. {
  245. dp[i][0]=bign(a.substr(1,i).c_str());
  246. for(int j=1;j<=k;j++)
  247. {
  248. for(int z=0;z<=i;z++)
  249. {
  250. temp=dp[z][j-1]*bign(a.substr(z+1,(i-z)).c_str());
  251. if(temp>dp[i][j])
  252. dp[i][j]=temp;
  253. }
  254. }
  255. }
  256. cout<<dp[n][k]<<endl;
  257. return 0;
  258. }
  259. inline void getInt(int* p) {
  260. char ch;
  261. do {
  262. ch = getchar();
  263. } while (ch == ' ' || ch == '\n');
  264. if (ch == '-') {
  265. *p = -(getchar() - '0');
  266. while ((ch = getchar()) >= '0' && ch <= '9') {
  267. *p = *p * 10 - ch + '0';
  268. }
  269. }
  270. else {
  271. *p = ch - '0';
  272. while ((ch = getchar()) >= '0' && ch <= '9') {
  273. *p = *p * 10 + ch - '0';
  274. }
  275. }
  276. }

牛客假日团队赛10 L 乘积最大 (dp,大数)的更多相关文章

  1. 牛客假日团队赛5 L Catch That Cow HDU 2717 (BFS)

    链接:https://ac.nowcoder.com/acm/contest/984/L 来源:牛客网 Catch That Cow 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 3 ...

  2. 牛客假日团队赛9 A 乘积最大 (简单DP)

    题目:https://ac.nowcoder.com/acm/contest/1071/A 题意:给你一个串,然后给你m个乘号,用m个乘号分割开这个串,然后求分割可以求出的最大值 思路:首先范围很小 ...

  3. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  4. P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D 迷路的牛 (贪心)

    链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  5. 牛客假日团队赛6 D 迷路的牛 (思维)

    链接:https://ac.nowcoder.com/acm/contest/993/D 来源:牛客网 迷路的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  6. 牛客假日团队赛5J 护城河 bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 (凸包的周长)

    链接:https://ac.nowcoder.com/acm/contest/984/J 来源:牛客网 护城河 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  7. 牛客假日团队赛5 K 金币馅饼 (DP 基础题)

    链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  8. 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day 牛客假日团队赛5 A (单调栈)

    链接:https://ac.nowcoder.com/acm/contest/984/A 来源:牛客网 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,00 ...

  9. 「BZOJ1669」D 饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5 (LIS,离散化树状数组)

    链接:https://ac.nowcoder.com/acm/contest/984/D 来源:牛客网 饥饿的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

随机推荐

  1. 根据XML文件 生成 java类

    最近一直在做关于webservice 的项目,这种项目最麻烦的就是根据对方的要求产生XML,文档里面虽然有XML结构,但是要转化为java里面的实体实在费劲, 有个自动化的工具就好了,半自动化也好,省 ...

  2. C# 反转单向链表

    static void Main(string[] args) { Mynode mynode0 = new Mynode(); Mynode mynode1 = new Mynode(); Myno ...

  3. pycharm设置背景颜色

    https://jingyan.baidu.com/article/9faa7231f88570473c28cb88.html

  4. C#吾日三省吾身

    全局变量与局部变量区别: 全局变量声明完毕后,就算不手动初始化赋值,也是有默认值的; 但是局部变量声明完毕后,如果不给它手动赋值,是无法直接使用这个变量的. 尽量避免少的装箱拆箱: ; .ToStri ...

  5. JobHandle和依赖项

    要当您调用作业的Schedule方法时,它将返回JobHandle.您可以在代码中使用一个JobHandle作为其他作业的依赖项.如果作业取决于另一个作业的结果,您可以将第一个作业JobHandle作 ...

  6. LeetCode.1122-相对排序数组(Relative Sort Array)

    这是小川的第393次更新,第427篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第258题(顺位题号是1122).给定两个数组arr1和arr2,arr2中的元素是不同的 ...

  7. 1.2.2 OSI参考模型 上

    一.HCNA网络技术学习指南 为了实现网络的互通及各种各样的网络应用,网络设备需要运行各种各样的协议已实现各种各样具体的功能.面对各种各样且数量繁多的功能,我们可以从网络架构的角度,引入功能分层的模型 ...

  8. 汉诺塔问题的C++实现

    有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆环,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘:大盘不能叠在小盘上面.如何移?最少要移动多少次? 原理可参 ...

  9. ASP.NET Core EFCore 之DBFirst 自动创建实体类和数据库上下文

    通过引用Nuget包添加实体类 运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer 运行 Install-Package Micros ...

  10. spring data 返回任意字段

    在spring boot + spring data查询数据库的过程中,有时候总会出现一些复杂的查询,我们希望数据库返回的字段能随意改变.这个需求在mybatis里很好解决,只需要用map接收就可以, ...