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();
}

P1018 乘积最大(高精度加/乘)的更多相关文章

  1. 洛谷 P1018 乘积最大

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

  2. P1018 乘积最大(DP)

    题目 P1018 乘积最大 解析 区间DP 设\(f[i][j]\)表示选\(i\)个数,插入\(j\)个乘号时的最大值 设\(num[i][j]\)是\(s[i,j]\)里的数字 转移方程就是\(f ...

  3. Luogu - P1018 乘积最大 - 题解

    原文:https://www.luogu.org/problemnew/solution/P1018?page=7 题目:P1018[乘积最大] 前言: 这题的正解理论上说是DP,可是由于民间数据太水 ...

  4. 【贪心】最大乘积-贪心-高精度-java

    问题 G: [贪心]最大乘积 时间限制: 1 Sec  内存限制: 128 MB提交: 34  解决: 10[提交][状态][讨论版] 题目描述  一个正整数一般可以分为几个互不相同的自然数的和,如3 ...

  5. luogu P1018 乘积最大

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

  6. caioj 1067动态规划入门(一维一边推5: 乘积最大(高精度版))

    因为这里涉及到乘号的个数,那么我们可以用f[i][j]表示前i个位乘号为j个时的最大乘积 那么相比上一题就是多了一层枚举多少个乘号的循环,可以得出 f[i][r] = max(f[j - 1][r - ...

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

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

  8. 洛谷P1018乘积最大——区间DP

    题目:https://www.luogu.org/problemnew/show/P1018 区间DP+高精,注意初始化和转移的细节. 代码如下: #include<iostream> # ...

  9. [NOIP2000] 提高组 洛谷P1018 乘积最大

    题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...

随机推荐

  1. 互联网轻量级框架SSM-查缺补漏第三天

    简言:平安夜,继续慵懒的学习.我真的是不喜欢学习··· 第三章认识MyBatis核心组件 3.1 持久层的概念和MyBatis的特点 持久层:可以将业务数据存储带磁盘,具有长期存储的能力.一般执行持久 ...

  2. hdu 1565 方格取数(1) 状态压缩dp

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. SZU2

    CF:Problem 425A 区间暴力,枚举区间.交换选定区间最小值和剩余区间最大值k次. 其实等同于将剩余区间最大k个加到选定区间里,然后排序 #include <iostream> ...

  4. Linux 文件系统大小调整

    有些使用需要进行文件系统的大小调整,比如使用LVM,或者在loopback设备上建立文件系统等,但该文件系统不是根文件系统时可以通过一下步骤,简单的进行: e2fsck -f /dev/loop0 r ...

  5. python文件修改 核心5步,函数实现修改任意文件内容

    文件修改 核心5步1.以读的模式打开原文件,产生句柄f12.以写的模式打开一个新文件,产生句柄f23.读取原文件的内容并将原文件需要替换的内容修改写入到新文件4.删除原文件5.把新文件重名了成原文件 ...

  6. ThreadLocal 理解

    主要方法 public void set(T value); public T get(); private T setInitialValue(); public void set(T value) ...

  7. Java中避免空指针的几个方法

    equals Object类中的equals 方法在非空对象引用上实现相等关系,具有对称性 x.equals(y) 和 y.equals(x) 结果是一样的,但当x == null时会抛出空指针异常 ...

  8. hdu 3367 Pseudoforest (最大生成树 最多存在一个环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 Pseudoforest Time Limit: 10000/5000 MS (Java/Oth ...

  9. Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析

    前言:Otto事件总线 -- 组件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle.intent等,从activityA --- activit ...

  10. 【统计学】英文概念之Mean和Average的区别

    通过专门检索和其他课本的比较,得到了如下结论.统计学在分析数据时,需要对数据进行最基础的描述性分析.在众多描述分析的指标中,平均数指标能够反映分布数列集中趋势.但是平均数指标包括两类:一类是数值平均数 ...