最大k乘积问题动态规划
设I是一个 n位十进制整数。如果将I划分为 k段,则可得到k个整数。这k个整数的 乘积称为I的一个 k乘积。试设计一个算法,对于给定的 I和 k,求出 I的最大 k乘积。 对于给定的I和k,计算 I的最大 k乘积.
-
输入: 第1 行中有2个正整数n和 k。正整数 n是序列 的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10) 输出: 输出最大k乘积 分析: c++代码:
//最大k乘积问题
#include<bits/stdc++.h>
using namespace std;
#define N 100
int dp[N][N],number[N];//dp前i位数划分j段的最大值,
int n ,k,num;//n位,划分k段 ,数值
void getNumber()//将数值存到数组中
{
int b = 0;
for(int i=n;i>0;i--){
b = num%10;
num = num/10;
number[i] = b;
}
for(int i=1;i<=n;i++)
cout<<number[i]<<" ";
cout<<endl;
}
int countNum(int p, int q)//获取第p~q位的数值 ,数组下标从0开始
{
int mm = 0;
for(int i=p;i<=q;i++){
mm = mm*10+number[i];
}
return mm;
}
main()
{
ifstream f1("1.txt");
ofstream f2("2.txt");
f1>>n;
f1>>k;
f1>>num;
cout<<n<<","<<k<<","<<num<<"
";
if(k==1){
cout<<"最大k乘积为:"<<num<<endl;
f2<<"最大k乘积为:"<<num<<endl;
return 0;
}
getNumber();
for(int i=1;i<=n;i++){
//初始化
dp[i][1] = countNum(1,i);
}
for(int i=1;i<=n;i++){
//位数
for(int j=1;j<=k;j++){
//分段数
if(j>i){
//分段数大于位数 ,结束本次循环
dp[i][j] = 0; break;
}else if(j==1){
//上面做过了,结束当前循环
continue;
}else{
int max =0, temp =0;
for(int a=i-1;a>=1;a--){
int ff = countNum(a+1,i);
temp = ff * dp[a][j-1];
if(temp>max) max =temp;
}
dp[i][j] = max;
}
}
}
cout<<"最大k乘积为:"<<dp[n][k]<<endl;
f2<<"最大k乘积为:"<<dp[n][k]<<endl;
f1.close();
f2.close();
return 0;
}
运行结果:
上一篇:
通过多线程提高代码的执行效率例子
