P1018 乘积最大

一道dp题目。比较好像的dp题目。

然而他需要高精度计算。

所以,他从我开始学oi,到现在。一直是60分的状态。

今天正打算复习模板。也就有借口解决了这道题目。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using std::max;
using std::min;
const int maxn=100;
const long long Base=1e7;
struct node
{int L;long long m[maxn];node(int a=-1) { L=a;memset(m,0,sizeof(m)); }void exact(){while(!m[L]&&L>-1) L--;return ;}void fill(char *A,int l,int r){int len=(r-l+1)/7-((r-l+1)%7==0);L=len;/*for(int i=len;i>=0;i--)for(int j=i*7;j<=i*7+6&&l+j<=r;j++)m[len-i]=m[len-i]*10+A[l+j]-'0';*/for(int i=r,tot=0;i>=0;i-=7,tot++)for(int j=min(6,i-l);j>=0&&i-j>=l;j--)m[tot]=m[tot]*10+A[i-j]-'0';return ;}node operator + (const node &a)const{node res(max(L,a.L)+1);for(int i=0;i<=res.L;i++){res.m[i]+=m[i]+a.m[i];res.m[i+1]+=res.m[i]/Base;res.m[i]%=Base;}res.exact();return res;}node operator * (const node &a)const{node res(L+a.L+1);for(int i=0;i<=L;i++)for(int j=0;j<=a.L;j++){res.m[i+j]+=m[i]*a.m[j];res.m[i+j+1]+=res.m[i+j]/Base;res.m[i+j]%=Base;}res.exact();return res;}bool operator <(const node &a)const{if(L!=a.L)  return L<a.L;for(int i=L;i>=0;i--)if(m[i]!=a.m[i])return m[i]<a.m[i];return true;}void print(){if(L==-1){printf("0");return ;}printf("%lld",m[L]);for(int i=L-1;i>=0;i--)printf("%07lld",m[i]);printf("\n");return ;}
};
node base[41][41];
node f[41][41];
node a,b,c;
char data[50];
int main()
{int s,k;scanf("%d%d",&s,&k);scanf("%s",data+1);/*for(long long i=2;i<=s;i++)for(long long j=i-1;j>0;j--){a[j][i]=a[j][i-1]*10+a[i][i];}*/for(int i=1;i<=s;i++)for(int j=i;j<=s;j++)base[i][j].fill(data,i,j);for(int i=1;i<=s;i++)f[i][0]=base[1][i];for(int k1=1;k1<=k;k1++)for(int i=k1;i<=s;i++)for(int j=k1;j<i;j++)f[i][k1]=max(f[i][k1],f[j][k1-1]*base[j+1][i]);f[s][k].print();
}

转载于:https://www.cnblogs.com/Lance1ot/p/9910697.html

P1018 乘积最大(高精度加/乘)相关推荐

  1. poj2756(高精度加减)

    是不是我没有理解这个题目,就是A+B高精度加减,为什么我的代码有问题呢?下面是自己写的代码,还是存在问题! #include<iostream> #include<algorithm ...

  2. 大数高精度加减、乘除、开根(C++版全套最详细、最易懂)

    大数高精度加减.乘除.开根 一.前面铺垫 二.加法 三.减法 四.乘法 五.除法 六.开根(待完善)   大数高精度加减乘除主要用在超过long型的数字计算(比如1000位数), 最基本的思路就是换成 ...

  3. 高精度加减乘法小程序

    复习高精度玩,写了个非常直观的加减乘程序. 1 Uses Math; 2 Var 3 a,b:AnsiSTring; 4 DC,la,lb:longint; 5 c:Array[-2555555..2 ...

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

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

  5. 高精度加、减、乘、除算法实现详解

    在说高精度加减乘除运算之前,我们先搞明白什么是高精度运算? 实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算.这个时候,如果要得到正确的计算结果,显然不能依 ...

  6. P1018 乘积最大

    https://www.luogu.org/problem/show?pid=1018#sub 其实这个数据范围貌似搜索是过不了的,但是在lg上过了 这里搜索的方法是,dfs(int x,LL ans ...

  7. 洛谷 P1018乘积最大

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

  8. BZOJ-1002 轮状病毒 高精度加减+Kirchhoff矩阵数定理+递推

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3543 Solved: 1953 [Submit][Statu ...

  9. 在计算机语言中的乘法,LOGO语言编程题  高精度乘法★★

    不限制位数的整数高精度乘法★★★★ 这是"高精度算法"系列文章中的第二篇.在"高精度加.减.乘.除"这4种计算中,加法最基础.最简单,乘法稍难,减法更难,除法最 ...

  10. 高精度加法 高精度减法 高度除法 高精度乘法 方法总结

    一.引言 对于数字的储存,用实数类型总会有一些不足,比如: 使用int 只能最多存储4个字节,范围也就是2的32次方: 使用double 只能最多储存8字节,就是2的64次方: 如果数字超过这个限制, ...

最新文章

  1. if for while until case select 命令
  2. 18.HMM隐马尔可夫模型
  3. redis 清空db下_PHP操作redis实现的分页列表
  4. 驱动GPIO操作归纳
  5. java中整形_java中怎样实现60多位整形数字的运算
  6. 聚焦2016:关于语音识别、图像识别及大数据
  7. 第1章:认识Java
  8. powerdesigner导入sql生成pdm没有注释_PDM手写签名实现方法
  9. caffe之学习曲线可视化
  10. PGP加密解密QQ邮箱邮件
  11. 计算机五笔字型编码方法,计算机汉字输入坐标码编码方法
  12. css margin 塌陷 经典bug
  13. 一张图搞懂CPU、OpenGL/DirectX、显卡驱动和GPU之间的关系
  14. WITNESS高级教程
  15. 开源软件学习交流计划 (西游记项目)
  16. 如何使用Google底部导航栏创建通知徽章
  17. 串级PID的一些理解
  18. Leetcode 387. 字符串中的第一个唯一字符
  19. 漫话算法[回溯]:从《大话西游》到掌握回溯思想!
  20. 快速提升认知,你必须知道四种底层思维(系列一)

热门文章

  1. 利用Github探测发现特斯拉API请求漏洞
  2. Dubbo 的心跳设计,值得学习!
  3. 为什么 Redis 默认 16 个库?90%以上程序员不知道!
  4. 5 个底层程序设计逻辑,决定你有多牛逼
  5. tomcat等web服务器的工作原理
  6. Android系统的若干关键词大汇总
  7. 疫情之后,有哪些巨大的商业机会?
  8. java合并表的两行_如何通过SQL将不同数据库表中记录两行合并为一行
  9. 用python编程、假设一年期定期利率_《Python程序设计》题库.pdf
  10. ArcGIS案例学习笔记-手动编辑擦除挖空挖除相减