因为这里涉及到乘号的个数,那么我们可以用f[i][j]表示前i个位乘号为j个时的最大乘积

那么相比上一题就是多了一层枚举多少个乘号的循环,可以得出

f[i][r] = max(f[j - 1][r - 1], num(j, i));

num(j, i)表示第j位到第i位的数,j < i

然后注意要用高精度来计算。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 112;
struct node
{
int len, s[MAXN];
node() { len = 0; memset(s, 0, sizeof(s)); }
};
int n, k, a[MAXN];
node f[MAXN][10], sum[MAXN][MAXN]; node cut(int x, int y)
{
node ret;
for(int i = y; i >= x; i--)
ret.s[++ret.len] = a[i];
return ret;
} node cheng(node a, node b)
{
node ret;
REP(i, 1, a.len + 1)
REP(j, 1, b.len + 1)
{
ret.s[i + j - 1] += a.s[i] * b.s[j];
ret.s[i + j] += ret.s[i + j - 1] / 10;
ret.s[i + j - 1] %= 10;
}
int& i = ret.len = a.len + b.len - 1;
while(ret.s[i+1] > 0)
{
i++;
ret.s[i + 1] += ret.s[i] / 10;
ret.s[i] %= 10;
}
while(!ret.s[i] && i > 1) i--;
return ret;
} node max_node(node a, node b)
{
if(a.len > b.len) return a;
else if(a.len < b.len) return b;
else
{
for(int i = a.len; i >= 1; i--)
{
if(a.s[i] > b.s[i]) return a;
else if(a.s[i] < b.s[i]) return b;
}
}
return a;
} int main()
{
scanf("%d%d", &n, &k);
REP(i, 1, n + 1) scanf("%1d", &a[i]), f[i][0] = cut(1, i);
REP(i, 1, n + 1)
REP(j, i, n + 1)
sum[i][j] = cut(i, j);
REP(r, 1, k + 1) //乘号的循环在外面
REP(i, 1, n + 1)
for(int j = i; j > 1; j--) //这里大于1,边界要注意一下
f[i][r] = max_node(f[i][r], cheng(f[j - 1][r - 1], sum[j][i]));
node t = f[n][k];
for(int i = t.len; i >= 1; i--) printf("%d", t.s[i]);
puts("");
return 0;
}

caioj 1067动态规划入门(一维一边推5: 乘积最大(高精度版))的更多相关文章

  1. caioj 1063 动态规划入门(一维一边推1:美元和马克)

    这道题一开始我是这么想的 最后的答案肯定是某次的马克换回来的,但这个该怎么确定?? 实际上应该把范围缩小,只看最后一次和倒数第二次之间有什么联系. 可以发现,只有两种可能,最后一天换或者不换.换的话就 ...

  2. caioj 1066 动态规划入门(一维一边推4:护卫队)(分组型dp总结)

    很容易想到f[i]为前i项的最优价值,但是我一直在纠结如果重量满了该怎么办. 正解有点枚举的味道. 就是枚举当前这辆车与这辆车以前的组合一组,在能组的里面取最优的. 然后要记得初始化,因为有min,所 ...

  3. caioj 1065 动态规划入门(一维一边推3:合唱队形)

    就是最长上升子序列,但是要用n^2的算法. #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int ...

  4. caioj 1071 动态规划入门(二维一边推4:相似基因) (最长公共子序列拓展)

    复制上一题总结 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽    (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符     (2) ...

  5. caioj 1070 动态规划入门(二维一边推3:字符距离)(最长公共子序列拓展)

    复制上一题总结 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽    (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符     (2) ...

  6. caioj 1069 动态规划入门(二维一边推2:顺序对齐)(最长公共子序列拓展总结)

    caioj 1068是最长公共子序列裸体,秒过, 就不写博客了 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽    (1) 字符串下标从1开始,因为0用来表示 ...

  7. caioj 1073 动态规划入门(三维一边推:最长公共子序列加强版(三串LCS))

    三维的与二维大同小异,看代码. #include<cstdio> #include<cstring> #include<algorithm> #define REP ...

  8. caioj 1072 动态规划入门(二维一边推5:最长公共子序列 LCSS加强版)

    在51nod刷到过同样的题,直接秒杀 见https://blog.csdn.net/qq_34416123/article/details/81697683 #include<cstdio> ...

  9. caioj 1080 动态规划入门(非常规DP4:乘电梯)(dp数组更新其他量)

    我一开始是这么想的 注意这道题数组下标是从大到小推,不是一般的从小到大推 f[i]表示从最高层h到第i层所花的最短时间,答案为f[1] 那么显然 f[i] = f[j] + wait(j) + (j ...

随机推荐

  1. WinForm关于listview的用法介绍

    public Form1() { InitializeComponent(); //控件的行为 listView1.Bounds = , ), , ));//相对位置 listView1.View = ...

  2. ModelDriven机制及其运用

    ModelDriven 为什么需要ModelDriven 所谓ModelDriven ,意思是直接把实体类当成页面数据的收集对象.比如,有实体类User 如下: package cn.com.lead ...

  3. 优动漫PAINT基础系列之图层模式

    在绘画软件优动漫PAINT中,笔刷工具属性中的消除锯齿变成灰色无法选择了?铅笔绘制没有压感?快来改改图层模式~ 优动漫PAINT下载:http://www.dongmansoft.com/xiazai ...

  4. 3ds Max实例教程-顽皮的小孩

    本教程介绍使用3ds Max制作设计一个顽皮的小孩,这个作品的灵感来源于作者的亲身经历,也是以真实人物为原型做出来这么一个小人. 作者: Claudius Vesting 使用软件:3ds Max,P ...

  5. redis中的事务、lua脚本和管道的使用场景

    参考文章 : https://blog.csdn.net/fangjian1204/article/details/50585080

  6. java redistemplate

    //添加一个 key ValueOperations<String, Object> value = redisTemplate.opsForValue(); value.set(&quo ...

  7. 【BZOJ 1257】[CQOI2007]余数之和

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] k%i=k-(k/i)i 则∑k%i = nk-∑(k/i)*i 因为k/i是整除运算. 所以会有某一段连续的i,它们的k/i的值都 ...

  8. 【codeforces 589G】Hiring

    [题目链接]:http://codeforces.com/problemset/problem/589/G [题意] 有n个人; 每个人每天在开始工作之前,都需要di单位的准备时间,然后才能开始工作; ...

  9. [转载]不唐突的JavaScript的七条准则

    经过多年的开发.教学和编写不唐突的JavaScript, 我发现了下面的一些准则.我希望它们可以帮助你对“为什么这样设计和执行JavaScript比较好”有一点理解.这些规则曾经帮助我更快地交付产品, ...

  10. NYIST 531 太空飞行计划

    太空飞行计划 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述        W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利 ...