RQNOJ 311 [NOIP2000]乘积最大:划分型dp
题目链接:https://www.rqnoj.cn/problem/311
题意:
给你一个长度为n的数字,用t个乘号分开,问你分开后乘积最大为多少。(6<=n<=40,1<=k<=30)
题解:
简化问题:
给原数字之前添加一个"1 *",乘号不计入数量,对答案无影响。
例如:"1231"可以变成"(1*)1231"。
表示状态:
dp[i][j] = max num(最后一个乘号之前的最大乘积)
i:此时在第i个数的前面添了一个乘号
j:用了j个乘号
例1:"(1*)12*31":
dp[2][1] = 12 (数位从0开始从左向右编号)
例2:"(1*)12*3*1"
dp[3][2] = 12*3 = 36
找出答案:
max dp[i][t] * cal_sec(i,n-1)
cal_sec(x,y)将数字串中[x,y]这个区间的字符串转化为数字
例如:设n=4,t=1.
此时为"(1*)12*31"
则此时这种方案的乘积为dp[2][1]* "31" = 12*31
如何转移:
dp[i][j] = max dp[k][j-1] * cal_sec(k,i-1)
在前面的某一段乘积后面再续上一串数字,达到第i位,用了j个乘号。
前面的某一段乘积:枚举最后一个乘号在第k个数字之前,用了j-1个乘号。
要续的数字:从第k位到i-1位 = cal_sec(k,i-1)
边界条件:
初始时用了0个乘号,但乘积为1。
例如:"(1*)1231".
特判:如果输入的数字就是0,则直接返回0.
注:输入用string,答案用long long存。
数据水。。。否则高精。。。
AC Code:
// state expression:
// dp[i][j] = max num
// i: last '*' is in front of ith bit
// j: used j '*'
//
// find the answer:
// max dp[i][t] * cal_sec(i,len-1)
//
// transferring:
// dp[i][j] = max dp[k][j-1] * cal_sec(k,i-1)
//
// boundary:
// if input == 0: return 0
// else dp[0] = 1, others = -1
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 45
#define MAX_K 35 using namespace std; int n,t;
long long ans;
long long dp[MAX_N][MAX_K];
long long sec[MAX_N][MAX_N];
string s; void read()
{
cin>>n>>t>>s;
} long long cal_sec(int x,int y)
{
if(sec[x][y]!=-) return sec[x][y];
long long res=;
for(int i=x;i<=y;i++)
{
res=res*+s[i]-'';
}
return sec[x][y]=res;
} void solve()
{
memset(sec,-,sizeof(sec));
memset(dp,-,sizeof(dp));
dp[][]=;
for(int i=;i<n;i++)
{
for(int j=;j<=t && j<=i;j++)
{
for(int k=;k<i;k++)
{
if(dp[k][j-]!=-)
{
dp[i][j]=max(dp[i][j],dp[k][j-]*cal_sec(k,i-));
}
}
}
}
ans=;
for(int i=;i<n;i++)
{
if(dp[i][t]!=-) ans=max(ans,dp[i][t]*cal_sec(i,n-));
}
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
RQNOJ 311 [NOIP2000]乘积最大:划分型dp的更多相关文章
- codevs1040统计单词个数(区间+划分型dp)
1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超 ...
- codevs3162抄书问题(划分型dp)
3162 抄书问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每 ...
- 125.乘积最大(划分性DP)
1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Descriptio ...
- Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)
描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词 ...
- Vijos_1218_数字游戏_(划分型动态规划+环状动态规划)
描述 https://vijos.org/p/1218 给出n个数围成一个环,将其划分成k个部分,每个部分求和再对10取模,最后将每个部分的值相乘,求其最大值与最小值. 描述 丁丁最近沉迷于一个数字游 ...
- 洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)
一看完这道题就知道是划分型dp 有两个点要注意 (1)怎么预处理子串. 表示以i为开头,结尾在j之前(含),有没有子串,有就1,没有就0 (2)dp的过程 这种分成k组最优的题目已经高度模板化了,我总 ...
- 划分型博弈型dp
划分型动态规划: 513. Perfect Squares https://www.lintcode.com/problem/perfect-squares/description?_from=lad ...
- 区间型DP
区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
随机推荐
- iOS 一些struct类型的NSLog输出
我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...
- VueJS构造器:new Vue({})
构造器 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例来启动的: var vm = new Vue({ // 选项 }) 属性与方法 每个 Vue 实例都会代理其 dat ...
- 创业神人&当时钢铁侠:Elon Musk
Steve Jobs的光环已经随着他的离去而淡褪,短期内,世上恐怕再难有人像他这样惊世骇俗般的改变了世界.但是如果你了解到一个人,一个来自南非年仅40岁的企业家,在短短的20年里,在全世界最酷的三个领 ...
- linux uart驱动——uart platfrom 注册(三)
一:注册platform device 注册一个platfrom device一般需要初始化两个内容,设备占用的资源resource和设备私有数据dev.platfrom_data.设备的resour ...
- nginx支持pathinfo模式
很久不使用apache了,渐渐对apache感到陌生,因为朋友有个ZendFramework框架从apache移到nginx下,需要pathinfo模式支持.网上海搜于是开始搜索nginx+pathi ...
- HDU3549_Flow Problem(网络流/EK)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- Unity3D研究院之拓展自定义编辑器窗口
Unity支持自行创建窗口,也支持自定义窗口布局.在Project视图中创建一个Editor文件夹,在文件夹中在创建一条脚本. 自定义窗口需要让脚本继承EditorWindow在设置MenuItem, ...
- WCF探索之旅(三)——IIS公布WCF服务
在之前的博客已经对WCF的基础知识做了介绍.而且做了一个简单的小样例. 假设你看了之前的博客,相信你已经对WCF有了一定的掌握.这篇博客主要说一下怎样把WCF服务公布的IISserver上. 在上篇博 ...
- IOS简单的渐变绘制
本文转载至 http://www.cnblogs.com/flychen/archive/2012/09/18/2690264.html 前几个星期项目中的音乐列表左边要添加阴影,做成平滑的效果.如图 ...
- C# 串口发送 陷阱,必须知道的坑
目的:间隔100毫秒持续发送指令 由于 C#串口发送为同步方式发送,发送占用时间较长,导致发送变慢, 自己写工具并手工测试两种波特率发送占用时长如下