/*
                                                        最大k乘积问题        
题目内容:

设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k ,求出I的最大k乘积.
Input
输入的第1行中有2个正整数n和k.正整数n是序列的长度;正整数k是分割的段数.接下来的一行中是一个n位十进制整数.(n<=10)
Output
输出计算结果,第1行中的数是计算出的最大k乘积.
n位十进制整数.(n<=10)

输入描述

输入的第1行中有2个正整数n和k.正整数n是序列的长度;正整数k是分割的段数.接下来的一行中是一个

输出描述

输出计算结果,第1行中的数是计算出的最大k乘积.

输入样例

2 1
15

输出样例

15
*/
//思路: 构造dp[i][k]表示从1到i位数分成k段的最大值,m[i][j]表示一个整数的第i位到j位构成的整数。
//递推关系: dp[i][k] = max(dp[i][k], dp[j][k - 1] * m[j+1][i],  1<=j<i; j表示分割的位置,枚举j,可以求得最大dp[i][k]

1.递归

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[15][15];
int m[15][15];

int fun(int i, int k){   //递归求解,表示返回从1到i位数分成k份相乘的最大数
    if(k == 1)
        return dp[i][k] = m[1][i];
    if(dp[i][k] != 0)
        return dp[i][k];    
    for(int j = 1; j < i; j++){
        dp[i][k] = max(dp[i][k], fun(j, k - 1) * m[j + 1][i]);
    }
    return dp[i][k];
}

int main(){
    int n, k, s;
    while(~scanf("%d%d", &n, &k)){
        memset(m, 0, sizeof(m));
        memset(dp, 0, sizeof(dp));
        scanf("%d", &s);
        int S = 1;
        for(int i = 1; i <= n; i++)
            S *= 10;
        //初始话m数组,将s的i到j位数存在里面
        for(int i = 1; i <= n; i++){
            m[i][n] = s % S;
            S /= 10;
            for(int j = n - 1; j >= i; j--){
                m[i][j] = m[i][j + 1] / 10;
//                cout << m[i][j] << " ";
            }
//            cout << endl;
        }    
        cout << fun(n, k);
    }
    return 0;
}

2.递推:

#include <iostream>
using namespace std;
int dp[100][100];
int m[100][100];

int main(){
    int n, k, a;
    cin >> n >> k >> a;
    if(k == 1){
        cout << a;
        return 1;
    }
    int b = 1, q = 1;
    for(int i = n; i >= 1; i--){
        int p = 10;
        b = a / q;
        q *= 10;
//        cout << b << endl;
        for(int j = i; j >= 1; j--){
            m[j][i] = b % p;
            p *= 10;  
//            cout << m[j][i] << " ";
        }
    }
//    dp[1][1] = a;
    for(int i = 1; i <= n; i++){       //枚举前n个数字
        for(int j = 0; j <= i; j++){   //枚举乘号的个数
            if(j == 0){
                dp[i][j] = m[1][i];
                continue;    
            }
            for(int n = 1; n <= i; n++)//枚举乘号的位置
                dp[i][j] = max(dp[i][j], dp[n][j-1]*m[k+1][i]);
        }
    }
    cout << dp[n][k];
    return 0;
}

20-最大k乘积问题的更多相关文章

  1. 最大k乘积问题

    68.最大k乘积问题 (15分)C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容:设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积. ...

  2. 最大 k 乘积问题 ( 经典区间DP )

    题意 : 设 NUM 是一个 n 位十进制整数.如果将 NUM 划分为 k 段,则可得到 k 个整数.这 k 个整数的乘积称为 NUM 的一个 k 乘积.试设计一个算法,对于给定的 NUM 和 k,求 ...

  3. 68.最大k乘积问题 (15分)

    C时间限制:3000 毫秒 |  C内存限制:3000 Kb题目内容:设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和 ...

  4. 【题解】K乘积

    题目描述 有N个数,每个数的范围是[-50,50],现在你要从这N个数中选出K个,使得这K个数的乘积最大. 输入格式 第一行,N和K. 1 <= N <= 50.  1 <= K & ...

  5. dp之区间:最大k乘积

    题目:给你一个n(1<=n<=15)位数,求将它分成m段,用m-1个*连接起来的最大乘积....... 思路:定义dp[i][j]为将前i位数分成j段的最大乘积,那么dp[i][j]==m ...

  6. 最大k乘积

    思路:看到这道题,第一思路就要是动态规划,不要想着用啥暴力或者排列组合,只会搞得很复杂. 动态规划的思路是对这个整数,我们从后向前进行划分k个数字,我们知道对于划分后的最后一个整数,它的位数要保证前面 ...

  7. 轻量级移动端类库,大小20多k,支持多指触摸。

    /* * 移动端 公共类库 * 作者:hqs */ (function(global, factory) { // cmd commonjs if (typeof module === "o ...

  8. Java实现k个数乘(cheng)(自然数的k乘积问题)

    k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...

  9. Python交互K线工具 K线核心功能+指标切换

    Python交互K线工具 K线核心功能+指标切换 aiqtt团队量化研究,用vn.py回测和研究策略.基于vnpy开源代码,刚开始接触pyqt,开发界面还是很痛苦,找了很多案例参考,但并不能完全满足我 ...

随机推荐

  1. mysql监控以及调优

    mysql 优点: 简单易用,成本低,易扩展,复制功能领先 mysql的生命周期: Mysql服务器监听3306端口>验证访问用户>创建mysql线程>检查内存(Qcache)> ...

  2. SignalR + Mvc 4 web 应用程序

    在上节中,我们已经初步对 SignalR 进行了了解,这一节我们将做一个SignalR Demon,具体的步骤如下: 1. 创建一个 mvc 4 web 应用程序,并选择 Basic 2. 创建一个 ...

  3. 手机端移动端的选择框mobileSelect.js使用

    手机端移动端的选择框mobileSelect.js使用 文件地址:https://github.com/onlyhom/mobileSelect.js 请感兴趣的自行下载 使用过程 1 引入标签 &l ...

  4. DBCP连接池配置常用参数说明

    参数 默认值 说明 username \ 传递给JDBC驱动的用于建立连接的用户名 password \ 传递给JDBC驱动的用于建立连接的密码 url \ 传递给JDBC驱动的用于建立连接的URL ...

  5. windows10系统右键添加cmd命令

    https://blog.csdn.net/Mr_BEelzebub/article/details/78776104 首先,在桌面新建一个文本文档. Windows Registry Editor ...

  6. vsphere使用笔记

    一,安装虚拟机,需要使用vsphere client上传镜像,提示错误:   vsphere client 上传文件:Failed to log into NFC Server   , 解决办法:用浏 ...

  7. leetcode108

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  8. 22.OGNL与ValueStack(VS)-默认类Math的访问

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在loginSuc.jsp中增加如下代码: 调用Math类中的静态方法:&l ...

  9. CSS3d 基础

    -webkit-transform-style:-webkit-preserve-3d;//设置3D转换 translateX:px; 平移 translateY:px; translateZ:px; ...

  10. Spring MVC 基本储备

    @RequestMapping value, method, params 必须存在参数, headers: 请求头部必须是啥样 @PathVariable 绑定URL参数 HiddenHttpMet ...