描述

暑假来了,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——整数划分(四)的更多相关文章

  1. nyoj746 整数划分(四)

    整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到 ...

  2. nyoj746 整数划分

    nyoj746 http://acm.nyist.net/JudgeOnline/problem.php?pid=746 一道区间dp的题目: 设:a[i][j]为那一串数字中从第i位到第j位的数是多 ...

  3. ACM 整数划分(四)

    整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...

  4. 整数划分 (区间DP)

    整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...

  5. 整数划分 Integer Partition(二)

    本文是整数划分的第二节,主要介绍整数划分的一些性质. 一 先来弥补一下上一篇文章的遗留问题:要求我们所取的 (n=m1+m2+...+mi )中  m1 m2 ... mi连续,比如5=1+4就不符合 ...

  6. 大概是:整数划分||DP||母函数||递推

    整数划分问题 整数划分是一个经典的问题. Input 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k <= n) Output 对于每组输入,请输出六行. ...

  7. HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结

    题意:给定一个字符串 输出回文子序列的个数    一个字符也算一个回文 很明显的区间dp  就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...

  8. 【noi 2.6_8787】数的划分(DP){附【转】整数划分的解题方法}

    题意:问把整数N分成K份的分法数.(与"放苹果"不同,在这题不可以有一份为空,但可以类比)解法:f[i][j]表示把i分成j份的方案数.f[i][j]=f[i-1][j-1](新开 ...

  9. 51nod p1201 整数划分

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2, ...

随机推荐

  1. export PATH=$PATH:/usr/local/mysql/bin

    [root@test]# export PATH=$PATH:/usr/local/mysql/bin[root@test]# echo $PATH/usr/local/sbin:/usr/local ...

  2. RAC上的DG搭建

    准备工作 修改rman_backup这个文件的所有者和所属组,修改为oracle用户的oinstall组的文件 #chown –R oracle:oinstall /rman_backup/ 主库和备 ...

  3. ctfhub技能树—文件上传—无验证

    打开靶机 查看页面信息 编写一句话木马 <?php echo "123"; @eval(@$_POST['a']); ?> 上传木马 上传成功,并拿到相对路径地址 查看 ...

  4. Windows系统使用运行框运行程序

    配置步骤 1. 在非系统盘创建一个新文件夹,自定义名称.将需要使用运行框启动的程序或文件放入文件夹,并将其更改为自己容易记忆的名称 2. 创建环境变量 右击 "此电脑" → &qu ...

  5. fsutil比较有用的几个命令

    Fsutil:fsinfo 主要由专业支持者使用.列出所有驱动器,查询驱动器类型,查询卷信息,查询特定的 卷信息或文件系统统计信息. 语法参数 drives 列出计算机中所有的驱动器. drivety ...

  6. idea 启动热部署Devtolls

    1.在子工程pom.xml中添加devtools jar包到需要启动的项目中 1 <dependency> 2 <groupId>org.springframework.boo ...

  7. Springmvc中参数的绑定

    .处理器适配器在执行Handler之前需要把http请求的key/value数据绑定到Handler方法形参数上. 1.默认支持的参数类型: HttpServletRequest,HttpServle ...

  8. 集成Redis缓存

    一.简介 1.场景 由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度. 2.RedisTemplate Jedis是Redi ...

  9. Git 创建新分支检查分支

    创建分支和切换分支,也可以称为检出分支 创建新分支 git branch branchName 切换到新分支 git checkout branchName 上面两个命令也可以合成为一个命令: git ...

  10. 大数据谢列3:Hdfs的HA实现

    在之前的文章:大数据系列:一文初识Hdfs , 大数据系列2:Hdfs的读写操作 中Hdfs的组成.读写有简单的介绍. 在里面介绍Secondary NameNode和Hdfs读写的流程. 并且在文章 ...