【wikioi】1017 乘积最大
算法:划分型DP
非常典型的一道题目,划分型DP
题目描述:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:有一个数字串:312, 当N=3,K=1时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
设数字串为a1a2a3……an。当k=1时,最大值为
max{a1*a2a3……an, a1a2*a3……an, …… , a1a2a3……an-1*an}
当k=2时,最大值为
max{a1*a2*a3……an, a1*a2a3……*an, …… , a1a2a3……*an-1*an}
引入记号f[i,k]表示从a0到ai,插入k个乘号所取得的最大值,用c[i,j]表示从ai到aj的数字列,则:
K=1时
f[n,1]=max{c[1,1]*c[2,n], c[1,2]*c[3,n], …… , c[1,n-1]*c[n,n]}
K=2时
f[n,2]=max{f[n-1,1]*c[n,n], f[n-2,1]*c[n-1,n], …… , f[2,1]*c[3,n]}
所以导出
f[n,k]=max{f[n-1,k-1]*c[n,n], f[n-2,k-1]*c[n-1,n], ....... , f[k,k-1]*c[k+1,n]}
我们用F[n][k]来表示f[n,k],表示划分k次得到的数最大,用A[i][j]表示c[i,j]
得到:
F[i][1] = max(F[i][1], A[1][j]*A[j+1][i]) (1 <= j < i)
F[i][k] = max(F[i][k], A[j+1][i]*F[j][k-1]) (k <= j < i)
其实这里可以简化成:
F[i][0] = A[1][i] (1 <= i <= n)
F[i][k] = max(F[i][k], A[j+1][i]*F[j][k-1]) (k <= j < i, 1 <= k <= m) m是要添加的乘号数目
而且发现,方程是以划分次数k为阶段,且顺序是递增(从k到i枚举j即可),那么我们就自底向上的来递推
所以顺序就一木了然了
上代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std; int n, m, i, j, k;
const int MAXK = 10;
const int MAXN = 100;
int c[MAXN] = {0}, A[MAXN][MAXN] = {{0,0}}, F[MAXN][MAXK] = {{0,0}};
int makeConut(int x, int y) //求x到y之间的数字列
{
int ans = 0;
while(x <= y) ans = ans * 10 + c[x++];
return ans;
} int main()
{
string str;
cin >> n >> m;
cin >> str;
for(i = 1; i <= n;i++) c[i] = (str[i-1]-'0');
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
A[i][j] = makeConut(i, j); //初始化A数组
//初始化k=0时的情况
//F[i][0] = A[1][i] (1 <= i <= n)
for(i = 1; i <= n; i++)
F[i][0] = A[1][i];
//DP
//F[i][k] = max(F[i][k], A[j+1][i]*F[j][k-1]) (1 <= k <= m)
for(k = 1; k <= m; k++)
for(i = k+1; i <= n; i++)
for(j = i-1; j >= k; j--)
F[i][k] = max(F[i][k], A[j+1][i]*F[j][k-1]);
cout << F[n][m] << endl;
return 0;
}
【wikioi】1017 乘积最大的更多相关文章
- wikioi 1017 乘积最大
dp[i][j]=max(dp[i][j],dp[t][k-1]*mapn[t+1][i]); dp[i][j]代表从0-i之间有j个乘号,mapn[i][j]表示第i位到第j位的数究竟是多少 #in ...
- codevs 1017 乘积最大
1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描 ...
- codevs 1017 乘积最大 dp
1017 乘积最大 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚 ...
- 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组
1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 #include <iostream> #include <string> #include & ...
- codevs——1017 乘积最大
1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Desc ...
- Codevs 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组
1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国 ...
- 【动态规划】【记忆化搜索】1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组
跟CODEVS 3415没有什么区别,也不用高精度. http://www.cnblogs.com/autsky-jadek/p/4055184.html #include<cstdio> ...
- [NOIP复习]第三章:动态规划
一.背包问题 最基础的一类动规问题.相似之处在于给n个物品或无穷多物品或不同种类的物品,每种物品仅仅有一个或若干个,给一个背包装入这些物品,要求在不超出背包容量的范围内,使得获得的价值或占用体积尽可能 ...
- 【wikioi】1040 统计单词个数
题目链接 算法:划分型DP PS:被卡过3天.日期:2013-10-10 ~ 2013-10-12 18:52:48 这题是我提交了13次AC= =汗= = 题目描述: 给出一个长度不超过200的由小 ...
随机推荐
- HTML5学习之画布和SVG(四)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 【tornado】系列项目(一)之基于领域驱动模型架构设计的京东用户管理后台
本博文将一步步揭秘京东等大型网站的领域驱动模型,致力于让读者完全掌握这种网络架构中的“高富帅”. 一.预备知识: 1.接口: python中并没有类似java等其它语言中的接口类型,但是python中 ...
- 【20140113】package 与 import
一个完整的java源程序应该包括下列部分: package语句: //该部分至多只有一句,必须放在源程序的第一句 import语句: public classDefinition: //公共类定义部分 ...
- Ext.MessageBox消息框
Ext JS消息提示框主要包括:alert.confirm.prompt.show 1.Ext.MessageBox.alert() 调用格式: alert( String title, String ...
- 没有VisualStudio也要HelloWorld
前言 在博客园看到Artech的通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)这篇文章,于是想跟着教程学习一下.说来惭愧,这篇文章发布于2014年12月,我在2016 ...
- 蛋疼的Fedora17
在公司给同事要安装ASM oracle 11g,说要在forder17上安装,于是乎我先在自己的虚拟机上安装了一个forder17,遇到了几个很蛋疼的问题: 1. 安装的时候没有创建普通用户 ...
- 使用Visual Studio Code开发AngularJS应用
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:VSC发布之后,尤其最近刚刚更新到0.3之后,社区出现了很多介绍VSC使用的好文章.比 ...
- ARM伪指令,王明学learn
ARM伪指令 在ARM汇编语言程序中里,有一些特殊指令助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作.伪指令在元程序中的作用是为完成汇编 ...
- 无法打开包括文件:“windows.h”: No such file or directory
VS2012 出现如下错误: 无法打开包括文件:"windows.h": No such file or directory 解决办法,将 C:\Program Files ...
- win7 快捷键
F F1 显示辅助 F2 重命名选定项目 F3 搜索文件或文件夹 F4 在 Windows 资源管理器中显示地址栏列表 F5 刷新活动窗口 F6 在窗口中或桌面上循环切换屏幕元素 F10 激活活动程序 ...