NYOJ746——整数划分(四)
描述
暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy
(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷。。亲爱的你能帮帮他吗?
问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积
- 输入
- 第一行是一个整数T,表示有T组测试数据
接下来T行,每行有两个正整数 n,m ( 1<= n < 10^19, 0 < m <= n的位数); - 输出
- 输出每组测试样例结果为一个整数占一行
- 样例输入
-
2
111 2
1111 2 - 样例输出
-
11
121
-
这题是区间dp,用dp[i][j]表示前i个数中插入j个乘号所得的最大乘积,先初始化dp[i][1],然后用状态转移方程dp[i][j]=max(dp[i][j],dp[k][j-1]*shu(k+1,i));就可以了,注意要用unsigned long long
-
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define ll unsigned long long
char str[30];
ll dp[25][25];
ll shu(int l,int r)
{
int i,j;
ll num=0;
for(i=l;i<=r;i++){
num=num*10+str[i]-'0';
}
return num;
} int main()
{
int i,j,T,len1,len,m,k;
ll num;
scanf("%d",&T);
while(T--)
{
scanf("%s%d",str+1,&m);
len1=strlen(str+1);
m--;
if(len1==1){
printf("%lld\n",str[1]-'0');continue;
}
num=0;
if(m==0){
for(i=1;i<=len1;i++){
num=num*10+str[i]-'0';
}
printf("%llu\n",num);
continue;
}
memset(dp,0,sizeof(dp));
for(i=2;i<=len1;i++){
for(k=1;k<i;k++){
dp[i][1]=max(dp[i][1],shu(1,k)*shu(k+1,i));
}
}
for(j=2;j<=m;j++){
for(i=j+1;i<=len1;i++){
for(k=j;k<i;k++)
dp[i][j]=max(dp[i][j],dp[k][j-1]*shu(k+1,i));
} }
printf("%llu\n",dp[len1][m]);
}
return 0;
}
也可以用四边形优化:(和邮局那题差不多的优化思路)
-
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define ll unsigned long long
char str[30];
ll dp[25][25];
int s[25][25];
ll shu(int l,int r)
{
int i,j;
ll num=0;
for(i=l;i<=r;i++){
num=num*10+str[i]-'0';
}
return num;
} int main()
{
int i,j,T,len1,len,m,k;
ll num;
scanf("%d",&T);
while(T--)
{
scanf("%s%d",str+1,&m);
len1=strlen(str+1);
m--;
if(len1==1){
printf("%lld\n",str[1]-'0');continue;
}
num=0;
if(m==0){
for(i=1;i<=len1;i++){
num=num*10+str[i]-'0';
}
printf("%llu\n",num);
continue;
}
memset(dp,0,sizeof(dp));
for(i=2;i<=len1;i++){
for(k=1;k<i;k++){
dp[i][1]=max(dp[i][1],shu(1,k)*shu(k+1,i));
}
s[i][1]=2;
}
for(j=2;j<=m;j++){
s[len1+1][j]=len1-1;
for(i=len1;i>j;i--){
for(k=s[i][j-1];k<=s[i+1][j];k++){
if(dp[i][j]<dp[k][j-1]*shu(k+1,i)){
dp[i][j]=dp[k][j-1]*shu(k+1,i);
s[i][j]=k;
}
} /*for(k=j;k<i;k++){
dp[i][j]=max(dp[i][j],dp[k][j-1]*shu(k+1,i));
}*/
} }
printf("%llu\n",dp[len1][m]);
}
return 0;
}
NYOJ746——整数划分(四)的更多相关文章
- nyoj746 整数划分(四)
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到 ...
- nyoj746 整数划分
nyoj746 http://acm.nyist.net/JudgeOnline/problem.php?pid=746 一道区间dp的题目: 设:a[i][j]为那一串数字中从第i位到第j位的数是多 ...
- ACM 整数划分(四)
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...
- 整数划分 (区间DP)
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...
- 整数划分 Integer Partition(二)
本文是整数划分的第二节,主要介绍整数划分的一些性质. 一 先来弥补一下上一篇文章的遗留问题:要求我们所取的 (n=m1+m2+...+mi )中 m1 m2 ... mi连续,比如5=1+4就不符合 ...
- 大概是:整数划分||DP||母函数||递推
整数划分问题 整数划分是一个经典的问题. Input 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k <= n) Output 对于每组输入,请输出六行. ...
- HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结
题意:给定一个字符串 输出回文子序列的个数 一个字符也算一个回文 很明显的区间dp 就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...
- 【noi 2.6_8787】数的划分(DP){附【转】整数划分的解题方法}
题意:问把整数N分成K份的分法数.(与"放苹果"不同,在这题不可以有一份为空,但可以类比)解法:f[i][j]表示把i分成j份的方案数.f[i][j]=f[i-1][j-1](新开 ...
- 51nod p1201 整数划分
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2, ...
随机推荐
- 剑指offer-查找数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 【Nginx】yum安装nginx
这里是nginx的yum安装源: centos7: rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-cent ...
- v-model语法糖
其实v-model就是一个结合了v-bind和v-on的语法糖,实现了双向数据绑定. 举个(栗子):
- [Usaco2015 dec]Breed Counting
原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397 用线段树维护区间和即可.时间复杂度\(O((N+Q)logN)\). #includ ...
- 2020年12月18号--21号 人工智能(深度学习DeepLearning)python、TensorFlow技术实战
深度学习DeepLearning(Python)实战培训班 时间地点: 2020 年 12 月 18 日-2020 年 12 月 21日 (第一天报到 授课三天:提前环境部署 电脑测试) 一.培训方式 ...
- SUGA
愿试炼的终点是花开万里 愿以渺小启程伟大结束 ----闵玧其
- 关于BI测试
BI测试: BI是从数据接入.数据准备.数据分析.数据可视化到数bai据分发应用的一系列过程,目的是为了辅助企业高效决策.而报表虽然最终也实现了数据可视化,但是对于数据分析的维度.深度.颗粒度.实时性 ...
- HTTP/1HTTP/2HTTP/3
https://mp.weixin.qq.com/s/fy84edOix5tGgcvdFkJi2w
- 前置时间(Lead Time),也称前置期、备货周期
https://wiki.mbalib.com/wiki/前导时间 什么是前导时间 所谓的前导时间(leading time),就是产品从设计,到生产.物流.销售的过程. BELLWETHER:&qu ...
- C++ Primer Plus读书笔记(三)复合类型
这节主要是介绍数组.结构体.类等概念,以及new delete内存管理. 1.数组 首先普及一下C++中字符串的概念,只有在结尾有 \0 的才叫字符串, cout 输出字符串也以空字符为标记进行结束输 ...