最大k乘积

思路:看到这道题,第一思路就要是动态规划,不要想着用啥暴力或者排列组合,只会搞得很复杂。
动态规划的思路是对这个整数,我们从后向前进行划分k个数字,我们知道对于划分后的最后一个整数,它的位数要保证前面的整数为k-1个(每个整数最少有一位),即最后一个整数的位数
最大为s=n-k+1位,这样最后一个整数的位数取值为1到n-k+1中的一个,同样取好最后一个整数后,对这个整数前面的数字按照同样的方法进行选取,即大问题一步步变为小问题。因为输入的数字可能为负数,所以n个数字相乘的绝对值应该是最小的。为取得最优的结果要进行回溯。
#include<bits/stdc++.h> using namespace std;
int n,k;
long int m;//十进制整数
int maxnum=-;//当m为正整数时,记录最大的正整数乘积。
int num=;
int minnum=;//当m为负整数时,记录最大的负整数乘积。
int pw(int i){//返回10的i次方
int f=;
for(int j=;j<=i;j++){
f*=;
}
return f;
} int comp(int n,int m,int i,int j)//用来截取整数的第i位和第j位之间的数字,如123456789当i为5j为7时s为67
{
int s=(m%pw(n-i))/pw(n-j);
return s;
} int f(int k,int m,int n)//dp+回溯
{
if(k== ){
num*=m;
if(num>maxnum){//m为正整数时求最大乘积
maxnum=num;
}
if(num<minnum){//m为负整数时求最小乘积
minnum=num;
}
num/=m;
}else{
int s=n-k+;//从后向前划分整数,s表示这个划分的数最大可以为几位
for(int i=;i<=s;i++){
int as=comp(n,m,n-i,n);
num*=as;
f(k-,comp(n,m,,n-i),n-i);//递归
num/=as;
}
}
return maxnum;
}
int main()
{
cin >> n >> k;
cin >> m;
if(m>=){
cout << f(k,m,n);
}else{//考虑可能输入为负数
m*=-;
f(k,m,n);
cout << (-)*minnum;
}
return ;
}

最大k乘积的更多相关文章
- 最大k乘积问题
68.最大k乘积问题 (15分)C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容:设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积. ...
- 20-最大k乘积问题
/* 最大k乘积问题 题目内容: 设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数. ...
- 最大 k 乘积问题 ( 经典区间DP )
题意 : 设 NUM 是一个 n 位十进制整数.如果将 NUM 划分为 k 段,则可得到 k 个整数.这 k 个整数的乘积称为 NUM 的一个 k 乘积.试设计一个算法,对于给定的 NUM 和 k,求 ...
- 68.最大k乘积问题 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容:设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和 ...
- 【题解】K乘积
题目描述 有N个数,每个数的范围是[-50,50],现在你要从这N个数中选出K个,使得这K个数的乘积最大. 输入格式 第一行,N和K. 1 <= N <= 50. 1 <= K & ...
- dp之区间:最大k乘积
题目:给你一个n(1<=n<=15)位数,求将它分成m段,用m-1个*连接起来的最大乘积....... 思路:定义dp[i][j]为将前i位数分成j段的最大乘积,那么dp[i][j]==m ...
- Java实现k个数乘(cheng)(自然数的k乘积问题)
k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...
- lightoj 1282 取对数的操作
/* 前三位 len=log10n^k(乘积的长度) len=klog10n n^k=x*10^(len-1) x=n^k/10^(len-1) log10x = k*log10n - (len-1) ...
- BZOJ3527 [Zjoi2014]力 【fft】
题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过 ...
随机推荐
- ubuntu lts install licode tag pre-v5.4
1. Requirements Ubuntu 14.04 LTS 2. Clone Licode codeYou first need to clone our code from github.Yo ...
- POJ3641(快速幂)
Pseudoprime numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8529 Accepted: 35 ...
- Day3-Python基础3---函数递归和函数式方程
一.函数的递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归特性: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应 ...
- idea右键单击没有 svn选项处理办法
问题一: IntelliJ IDEA打开带SVN信息的项目不显示SVN信息,项目右键SVN以及图标还有Changes都不显示解决方法 在VCS菜单中有个开关,叫Enabled Version Cont ...
- Appium—python_ 安卓手机划屏幕操作
开始的时候 不知道 python_unittest框架的命名规则,导致方法进不去,后来 改变方法名 能获取 # conding=utf- from appium import webdriver im ...
- suse 源的添加与删除,以及源地址
地址 一个是上海交大的,http://ftp.sjtu.edu.cn/opensuse/update/ 葡萄牙的: http://ftp.nux.ipb.pt/pub/dists/opensuse/u ...
- 如何删除offline数据文件/表空间上的分区
接上一篇"Oracle 10g RAC全库flashback " http://www.cnblogs.com/cqubityj/p/3265552.html 在打开数据库之前把2 ...
- Java中Exception的种类
通常来讲,Java中的异常会被分为三种: Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身. Runtime Exception: 运行时异常往往与环境有关,编译时无法检查,并且可 ...
- 类型:.net;问题:iis注册;结果:.net4.0注册到IIS ,重新注册IIS ,iis注册
.net4.0注册到IIS ,重新注册IIS ,iis注册 IIS和.netfw4.0安装顺序是从前到后,如果不小心颠倒了,无所谓. 打开程序-运行-cmd:输入一下命令重新注册IIS C:\WI ...
- onclick事件没有反应的五种可能情况
转自:https://blog.csdn.net/qujing_1120/article/details/76853039 onclick=”alert()” 事件没有反应的几种情况.第一:<i ...