美文网首页动态规划动态规划
动态规划最大K乘积问题

动态规划最大K乘积问题

作者: Super_邓帅 | 来源:发表于2017-01-01 15:14 被阅读0次


最大K乘积动态规划解决

设I是一个n位十进制整数。如果将I分割为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
测试:
输入: 2 1 (2是位数,1是分几段)
   15 (15是I)
输出:15
输入: 5 2
   12345
输出:6170

分析:

1、数组m[i][j]为 将前i位数分成j段的最大乘积
  2、数组打底:前1位数,分成1段;前2位数,分成1段;前3位数,分成1段......前n位数,分成1段。(就是先计算出前i位的大小)
  3、m[i][j]=Max{m[k][j-1]*a[i-k]},其意思就是把前k(1<=k<i)个数分成j-1段,再乘以a[i-k],a[i-k]代表着,第k位到第i位数的数值.......

#include<stdio.h>

int cal(char* num,int i,int j){
    int value=0;
    while(j>=i){
        value=value*10+(num[i]-'0');
        i++;    
    }
    return value;
}

int main(){
    int n,k;               //n代表整数有n位,k指分成多少段
    scanf("%d%d",&n,&k);
    getchar();
    char num[n+1];        //接收单个字符 
    int m[n+1][n+1];      //m[i][j] 前i个数字,分成j段 
    int max,value;
    
    for(int i=1;i<n+1;i++){
        scanf("%c",&num[i]);
    } 

    //数组打底
    m[1][1]=num[1]-'0';                     
    for(int i=2;i<n+1;i++)                 
        m[i][1]=m[i-1][1]*10+(num[i]-'0');   //前i个数字,分成一段 
    
    for(int i=2;i<=k;i++){   //分成多少段 
        max=-1; 
        for(int j=i;j<n+1;j++){   //j从开始遍历到最后一个数,因为i<j时(前3个数,分成4段),无意义,所以直接令j=i 
            for(int d=1;d<=j-1;d++){
                value=m[d][i-1]*cal(num,d+1,j);
                if(value>max)
                    max=value;
            }
            m[j][i]=max;    
        } 
    }
    
    printf("最大k乘积为:%d\n",m[n][k]);  
    return 0;
}
运行截图
运行截图

相关文章

  • 动态规划最大K乘积问题

    最大K乘积动态规划解决 设I是一个n位十进制整数。如果将I分割为k段,则可得到k个整数。这k个整数的乘积称为I的一...

  • 网易17校招编程笔试题Java解法赏析(更新至第9题)

    1 合唱团(动态规划) 分析 要求n个学生中选择k个,使这k个学生的能力值乘积最大。这是一个最优化的问题。另外,在...

  • 2019-10-27

    今天做最大k乘积问题

  • 乘积最大子序列

    题目描述 解题思路 动态规划,从0-i的子数组的最大乘积为max,最小乘积为min,则0-i+1的最大乘积为 i+...

  • LeetCode 152. Maximum Product Su

    动态规划问题 记 n_max [i] 为以 nums[i] 为结尾的子序列的最大乘积记 n_min [i] 为以 ...

  • 动态规划法(九)想要更多例子?

      本文将会介绍三个用动态规划法解决的例子,分别是: 楼梯台阶问题 二项式系数求解 最大乘积子数组问题 楼梯台阶问...

  • 14.剪绳子

    思路: 采用动态规划 抽象一下,可以看作是一个分割整数,求乘积最大的问题,leetcode上应该有原题 本书代码中...

  • 2018-06-11

    动态规划法解剪绳子问题 1.问题: 2.分析:定义函数f(n)为长度为n的绳子剪成若干段后的最大长度乘积 若从上而...

  • 动态规划4:乘积最大子序列

    给定一个数组,找到其连续子序列的最大乘积。 例如: 分析: 尝试定义状态: f(n)为以arr[n]结尾的子序列的...

  • 算法笔记_02:蓝桥杯练习 最大的算式

    引用 动态规划:最大算式 1 问题描述 问题描述题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号...

网友评论

    本文标题:动态规划最大K乘积问题

    本文链接:https://www.haomeiwen.com/subject/yrlivttx.html