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, ...
随机推荐
- innobackupex: Connecting to MySQL server with DSN 'dbi:mysql
[root@ma src]# innobackupex --user=root /root/backup --no-timestamp InnoDB Backup Utility v1.5.1-xtr ...
- 【ASM】asm从共享磁盘复制到本地磁盘中
将ASM里面的文件copy到文件系统 数据文件存放在ASM里面查看不是很直观,有时候需要把文件从ASM里面copy到文件系统.我记录了一下两种方法,还有一种用AMDU,ODU也可以实现 1. 直接在a ...
- 未使用绑定变量对share_pool的影响
oracle SGA中包含数据高速缓冲,重做日志缓冲,以及共享池(share_pool).共享池中包含库高速缓冲(所有的SQL,执行计划等)和数据字典缓冲(对象的定义,权限等). 所以,如果SQL中没 ...
- MySQL全面瓦解19:游标相关
定义 我们经常会遇到这样的一种情况,需要对我们查询的结果进行遍历操作,并对遍历到的每一条数据进行处理,这时候就会使用到游标. 所以:游标(Cursor)是处理数据的一种存储在MySQL服务器上的数据库 ...
- Java 给Word不同页面设置不同背景
Word文档中,可直接通过[设计]-[页面颜色]页面颜色,通过Java代码可参考如下设置方法: 1. 设置单一颜色背景 doc.getBackground().setType(BackgroundTy ...
- 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾
https://mp.weixin.qq.com/s/67NvEVljnU-0-6rb7MWpGw 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾 原创 蚂蚁金 ...
- CKafka 架构原理
消息队列 CKafka 技术原理 - 产品简介 - 文档中心 - 腾讯云 https://cloud.tencent.com/document/product/597/10067 消息队列 CKafk ...
- 单点登录(SSO)的设计与实现
一.前言 1.SSO说明 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.https://baike.baidu.c ...
- springboot开启多线程配置
一.配置线程池参数 @EnableAsync @Configuration public class TaskExecutorConfig { @Bean public TaskExecutor ta ...
- 洛谷P2145
Description 给定一串数字,每个数字代表一种颜色 你可以向这个数字序列里加任意数字,每加一个视为一次操作 当你加入的数字和与它相连的同种数字不少于三个时,他们就会消除 消除后序列的两端自动靠 ...