caioj 1067动态规划入门(一维一边推5: 乘积最大(高精度版))
因为这里涉及到乘号的个数,那么我们可以用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: 乘积最大(高精度版))的更多相关文章
- caioj 1063 动态规划入门(一维一边推1:美元和马克)
这道题一开始我是这么想的 最后的答案肯定是某次的马克换回来的,但这个该怎么确定?? 实际上应该把范围缩小,只看最后一次和倒数第二次之间有什么联系. 可以发现,只有两种可能,最后一天换或者不换.换的话就 ...
- caioj 1066 动态规划入门(一维一边推4:护卫队)(分组型dp总结)
很容易想到f[i]为前i项的最优价值,但是我一直在纠结如果重量满了该怎么办. 正解有点枚举的味道. 就是枚举当前这辆车与这辆车以前的组合一组,在能组的里面取最优的. 然后要记得初始化,因为有min,所 ...
- caioj 1065 动态规划入门(一维一边推3:合唱队形)
就是最长上升子序列,但是要用n^2的算法. #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int ...
- caioj 1071 动态规划入门(二维一边推4:相似基因) (最长公共子序列拓展)
复制上一题总结 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽 (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符 (2) ...
- caioj 1070 动态规划入门(二维一边推3:字符距离)(最长公共子序列拓展)
复制上一题总结 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽 (1) 字符串下标从1开始,因为0用来表示字符为空的情况,而不是第一个字符 (2) ...
- caioj 1069 动态规划入门(二维一边推2:顺序对齐)(最长公共子序列拓展总结)
caioj 1068是最长公共子序列裸体,秒过, 就不写博客了 caioj 1069到1071 都是最长公共字序列的拓展,我总结出了一个模型,屡试不爽 (1) 字符串下标从1开始,因为0用来表示 ...
- caioj 1073 动态规划入门(三维一边推:最长公共子序列加强版(三串LCS))
三维的与二维大同小异,看代码. #include<cstdio> #include<cstring> #include<algorithm> #define REP ...
- caioj 1072 动态规划入门(二维一边推5:最长公共子序列 LCSS加强版)
在51nod刷到过同样的题,直接秒杀 见https://blog.csdn.net/qq_34416123/article/details/81697683 #include<cstdio> ...
- caioj 1080 动态规划入门(非常规DP4:乘电梯)(dp数组更新其他量)
我一开始是这么想的 注意这道题数组下标是从大到小推,不是一般的从小到大推 f[i]表示从最高层h到第i层所花的最短时间,答案为f[1] 那么显然 f[i] = f[j] + wait(j) + (j ...
随机推荐
- (转载)你真的理解Android AIDL中的in,out,inout么?
前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了——或者并没有,但所占篇幅甚小,且基本上都是 ...
- Springboot如何利用http请求控制器
写好了接口,现在想用postman测试一下这个接口是否正确,想请问怎么传入请求参数?先谢谢了! Springboot如何利用http请求控制器 >> java这个答案描述的挺清楚的:htt ...
- ui5 load josn
sap.ui.jsview("ui5p.Test01", { /** Specifies the Controller belonging to this View. * In t ...
- 理解 this.initialize.apply ( this, arguments )定义对象的一种方式
var Class = { create:function() { return function() { this.initialize.apply(this, arguments); }; } } ...
- windows下安装redis以及测试 Window 下安装
下载地址:https://github.com/dmajkic/redis/downloads. 下载到的Redis支持32bit和64bit.根据自己实际情况选择,将64bit的内容cp到自定义盘符 ...
- PHP JWT初识
一直没有好好看过jwt,直到前两天要做web验证,朋友给我推荐了jwt.才发现jwt已经被大家广泛的应用了.看来我有点out了.哈哈,趁着这个世界来好好看看这个. JWT(JSON Web Token ...
- 比较排序算法(PHP)
冒泡排序 两两比较相邻记录的关键字,如果反序则交换,大的数字往下沉,一直到最大的出现在数组最后 function swap(&$x, &$y) { $temp = $x; $x = $ ...
- Vue组件开发 -- Markdown
利用marked 和 highlight.js开发markdown组件 实现效果图如下: markdown组件已这种形式<Markdown v-model="markdown" ...
- 【转】C#添加修改删除文件文件夹大全
[转]C#添加修改删除文件文件夹大全 C#添加修改删除文件文件夹大全 StreamWriter sw = File.AppendText(Server.MapPath(".")+& ...
- Redit集群搭建-Sentinel模式搭建
Redit集群搭建 学习了: Windows:http://blog.csdn.net/mrxiagc/article/details/52799081 Linux:https://www.cnblo ...