描述

暑假来了,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. MyBatis 查询的时候属性名和字段名不一致的问题

    目录 问题 解决方案:resultMap 问题 当我们数据库中的字段和实体类中的字段不一致的时候,查询会出问题 数据库字段是 pwd id name pwd 1 张三 123456 2 李四 1234 ...

  2. xtrabackup不完全恢复

    例如,在2014年6月26日下午14:00的时候有人误操作drop掉了一张表,由于库不是很大,并且为测试库,并没有访问,这个时候,我们可以进行基于位置和时间点的不完全恢复 先找到早上的备份,查看那xt ...

  3. zabbix 监控的数据

    /usr/local/zabbix/bin/zabbix_sender --zabbix-server 192.168.1.10 --port 10051 --input-file /var/log/ ...

  4. 【Linux】用yum来下载rpm,而不安装

    方法一:yum yum命令本身就可以用来下载一个RPM包,标准的yum命令提供了--downloadonly(只下载)的选项来达到这个目的. $ sudo yum install --download ...

  5. 工作记录:记一次线上ZK掉线问题排查

    目录 问题的发现 zk的情况以及分析 总结 问题的发现 最早问题的发现在于用户提的,用户提出他支付时支付失败,过了一会儿再试就好了,于是翻日志,查询到当时duboo调用出现了下类错误: [TraceI ...

  6. 视图V_160M和表T_160M的维护

    今天发现一个视图,通过SM30居然无法维护,这个视图就是V_160M,表为T_160M,是采购相关的系统消息, 不过别着急,有办法维护的,呵呵,看下面: 试一试OMCQ这个事物代码吧! 分享出来,给需 ...

  7. [Usaco2009 Feb]Revamping Trails 道路升级

    题目描述 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 < ...

  8. [Usaco2008 Feb]Line连线游戏

    题目描述 Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i个点 的横.纵 ...

  9. Java异常处理场景中不同位置的返回值详细解析

    Java 异常处理中的返回值在不同位置不同场景下是有一些差别的,这里需要格外注意 具体分以下两种场景: 1 finally语句块没有return语句,即当代码执行到try或者catch语句块中的ret ...

  10. Development desciptor

    概述与作用: 部署描述符是用于描述Web应用程序的元数据,并为Java EE Web应用程序服务器部署和运行Web应用程序提供指令.从传统上来说,所有元数据都来自于部署描述符文件/WEB-INF/we ...