/*
                                                        最大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. git修改用户名和邮箱

    用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变. 每次commit都会用用户名和邮箱纪录. 1.查看用户名和地址 git config user.name git config us ...

  2. Oracle 统计量NO_INVALIDATE参数配置(上)

    转载:http://blog.itpub.net/17203031/viewspace-1067312/ Oracle统计量对于CBO执行是至关重要的.RBO是建立在数据结构的基础上的,DDL结构.约 ...

  3. PCB的初次窥探

    第一次画PCB经常用到的知识点 鼠标拖动+X      :左右转动(对称) +space:90度转动 +L      :顶层与底层的切换 Ctrl+M:测量 J + C:查找原件 交叉探针+原理图(P ...

  4. tornado-简单的服务器非阻塞

    1.服务器 非阻塞 import tornado.ioloop import tornado.web import tornado.httpserver # 非阻塞 import tornado.op ...

  5. python2-python3字符串

    https://www.cnblogs.com/yangmingxianshen/p/7990102.html

  6. ZABBIX监控80连接数

    自定义监控项(监控网站80连接数 http://blog.51cto.com/shuzonglu/2104195

  7. Socket IO Web实时推送

    1服务器pom.xml引入 <!-- 服务端 --> <dependency> <groupId>com.corundumstudio.socketio</g ...

  8. request传递参数

    当客户请求时,Servlet容器创建SrevletRequest对象(用于封装客户的请求信息),这个对象将被容器作为service()方法的参数之一传递给Srevlet,Servlet可以利用Serv ...

  9. 如何将Wav文件做到EXE文件里

    1)编写.RC文件 ..RC文件是资源的源文件,编译器也就编译这个文件,生成.RES的资源文件 首先在我们的项目子目录中建立一个纯文本文件,起名叫Sound.rc,文件中 有一行,内容为: SOUND ...

  10. oracle 文件系统

    oracle数据文件信息 select * from v$datafile;--查看数据文件信息select * from v$controlfile;--查看控制文件信息 一.控制文件(Contro ...