动态规划

博客围绕最大K乘积问题展开,该问题是将一个n位十进制整数I划分为k段,求这k个整数的最大乘积。给出了如1234划分为3段的示例,还说明了编程任务是计算给定I和k时的最大k乘积,以及数据输入格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

i.最大K乘积问题
问题描述
设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
例如十进制整数 1234 划分为 3 段可有如下情形:
1 × 2 × 34 = 68
1 × 23 × 4 = 92
12 × 3 × 4 = 144
编程任务
对于给定的I 和k,编程计算I 的最大k 乘积。
数据输入
输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int ans[1000][1000];

void getAns(int n,int k,int num){
   
   ans[2][1]=num/(int(pow(10,n-2)));
   ans[1][1]=num/(int(pow(10,n-1)));
   for(int i=2;i<=n;i++){//数长度为i
   	int num1=num/(int(pow(10,n-i)));
   	for(int j=2;j<=i&&j<=k;j++){//分为j段,依次填表
   		int m=-1;//假设为最小
   		for(int b=i-1;b>=1&&b>=j-1;b--){//转移方程:ans[i][j]=max(ans[p][j-1]),1<=p<=i-1;
   			m=max(ans[b][j-1]*(num1%(int(pow(10,i-b)))),m);
   		}
   		ans[i][j]=m;
   	}
   }

}

int main(){
   int n,k,num;
   scanf("%d%d%d",&n,&k,&num);//n>1,1<k<=n
   memset(ans,0,sizeof(ans));//置零
   getAns(n,k,num);
   printf("%d\n",ans[n][k]);//输出长度为n,分为k端的最大k乘积
   return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值