P1018 乘积最大(高精度加/乘)
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 乘积最大(高精度加/乘)相关推荐
- poj2756(高精度加减)
是不是我没有理解这个题目,就是A+B高精度加减,为什么我的代码有问题呢?下面是自己写的代码,还是存在问题! #include<iostream> #include<algorithm ...
- 大数高精度加减、乘除、开根(C++版全套最详细、最易懂)
大数高精度加减.乘除.开根 一.前面铺垫 二.加法 三.减法 四.乘法 五.除法 六.开根(待完善) 大数高精度加减乘除主要用在超过long型的数字计算(比如1000位数), 最基本的思路就是换成 ...
- 高精度加减乘法小程序
复习高精度玩,写了个非常直观的加减乘程序. 1 Uses Math; 2 Var 3 a,b:AnsiSTring; 4 DC,la,lb:longint; 5 c:Array[-2555555..2 ...
- 洛谷P1018乘积最大题解--zhengjun
题目描述 今年是国际数学联盟确定的" 200020002000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰909090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的 ...
- 高精度加、减、乘、除算法实现详解
在说高精度加减乘除运算之前,我们先搞明白什么是高精度运算? 实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算.这个时候,如果要得到正确的计算结果,显然不能依 ...
- P1018 乘积最大
https://www.luogu.org/problem/show?pid=1018#sub 其实这个数据范围貌似搜索是过不了的,但是在lg上过了 这里搜索的方法是,dfs(int x,LL ans ...
- 洛谷 P1018乘积最大
题目描述 今年是国际数学联盟确定的"20002000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰9090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的 ...
- BZOJ-1002 轮状病毒 高精度加减+Kirchhoff矩阵数定理+递推
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3543 Solved: 1953 [Submit][Statu ...
- 在计算机语言中的乘法,LOGO语言编程题 高精度乘法★★
不限制位数的整数高精度乘法★★★★ 这是"高精度算法"系列文章中的第二篇.在"高精度加.减.乘.除"这4种计算中,加法最基础.最简单,乘法稍难,减法更难,除法最 ...
- 高精度加法 高精度减法 高度除法 高精度乘法 方法总结
一.引言 对于数字的储存,用实数类型总会有一些不足,比如: 使用int 只能最多存储4个字节,范围也就是2的32次方: 使用double 只能最多储存8字节,就是2的64次方: 如果数字超过这个限制, ...
最新文章
- if for while until case select 命令
- 18.HMM隐马尔可夫模型
- redis 清空db下_PHP操作redis实现的分页列表
- 驱动GPIO操作归纳
- java中整形_java中怎样实现60多位整形数字的运算
- 聚焦2016:关于语音识别、图像识别及大数据
- 第1章:认识Java
- powerdesigner导入sql生成pdm没有注释_PDM手写签名实现方法
- caffe之学习曲线可视化
- PGP加密解密QQ邮箱邮件
- 计算机五笔字型编码方法,计算机汉字输入坐标码编码方法
- css margin 塌陷 经典bug
- 一张图搞懂CPU、OpenGL/DirectX、显卡驱动和GPU之间的关系
- WITNESS高级教程
- 开源软件学习交流计划 (西游记项目)
- 如何使用Google底部导航栏创建通知徽章
- 串级PID的一些理解
- Leetcode 387. 字符串中的第一个唯一字符
- 漫话算法[回溯]:从《大话西游》到掌握回溯思想!
- 快速提升认知,你必须知道四种底层思维(系列一)