最大K乘积
来源:互联网 发布:sqlserver下载 64位 编辑:程序博客网 时间:2024/06/04 08:42
题目描述:
相关介绍:最大 K 乘积
给定一个数字 n,将其分成 k 段,求这 k 段乘积的最大值;
如:将 12345 分成 2 段,最大K乘积为 1234*5 = 6170;
思路:
若设 d(i, j) 为将前 i 位数分成 j 段的最大值,num(m, n)为从第 m 到第 n 的数,则 d(i, j) = max{ num(i, i)*d(i-1, j-1), num(i-1, i)*d(i-2, j-1), num(i-2, i)*d(i-3, j-1), ….} (i-x >= j-1)(至少要有 j-1 个数才能分成 j - 1 段);
用上面的 12345 举个例子:
例如求 d(5, 3) = { 5*d(4, 2), 45* d(3, 2), 345*d(2, 2)};
代码:
#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int maxn = 10000;int mkp[maxn][maxn];int kount_bit(int n){ int i = 0; while(n) { n /= 10; i++; } return i;}int get_num(int n, int bit, int i, int j){ return n / (int)pow(10, bit-j) % (int)pow(10, j-i+1);}int max_mkp(int n, int i, int j){ int bit = kount_bit(n), temp; int max_num = get_num(n, bit, i, i) * mkp[i-1][j-1]; for(int k = i-2; k >= j; k--) { temp = get_num(n, bit, k+1, i)*mkp[k][j-1]; if(max_num < temp) max_num = temp; } return max_num;}void max_k_product(int n, int k){ if(k == 1) { printf("%d", n); return ; } int bit = kount_bit(n); for(int i = 1; i <= bit; i++) mkp[i][1] = get_num(n, bit, 1, i); for(int j = 2; j <= k; j++) for(int i = j; i <= bit; i++) { mkp[i][j] = max_mkp(n, i, j); } printf("%d", mkp[bit][k]);}int main(){ int n, k; cin >> n >> k; max_k_product(n, k); return 0;}
0 0
- 最大K乘积
- 最大K乘积
- 最大K乘积问题:
- 最大k乘积问题
- 最大K乘积
- 最大K乘积问题
- 最大K乘积问题
- 最大K乘积问题
- 最大k乘积
- 最大k乘积问题
- 最大k乘积
- 最大k乘积问题
- 最大k乘积问题
- 最大K乘积
- 最大k乘积问题
- 最大k乘积
- 【dp】最大k乘积问题
- C++ 实现最大k乘积
- UIManager
- QT:在Qt中使用SQLite数据库
- UIBase
- greenDAO 3.2 初探
- LoginPanel
- 最大K乘积
- mac mysql 重置root密码
- QT:Qt多线程创建
- 尺取法
- Lucene学习-CRUD
- QT:Qt多线程同步
- Linux时间参数atime、ctime、mtime
- windows搭建spark运行环境(windows scala,hadoop,spark安装,idea使用配置等)
- 部署 instance 到 OVS vlan100