【动态规划】最大k乘积问题

Description

     
  设I是一个 n位十进制整数。如果将I划分为 k段,则可得到k个整数。这k个整数的 乘积称为I的一个 k乘积。试设计一个算法,对于给定的 I和 k,求出 I的最大 k乘积。 对于给定的I和k,计算 I的最大 k乘积。  
     

Input

     
 
第1 行中有2个正整数n和 k。正整数 n是序列
的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10) 
 
     

Output

     
 
输出最大k乘积
 
     

Sample Input

     
 
2 1 
15 
 
     

Sample Output

     
 
15
 
 
#include<iostream>  
using namespace std;  
#define N 20  
int m[N][N];  
char num[N];  
  
int atoi(char arr[],int i,int j)  
{  
	int sum=0;  
	while(i<=j)  
	{  
        sum = sum*10+arr[i]-'0';  //此处本来用了函数pow,然后wa了,一直找不到错在何处,  
		i++;		//后来问师兄,才发现原来pow(double,int)   
	} 			//的参数double会使结果又偏差,改掉后就ac了  
    return sum;  
}  
  
int main()  
{  
	int n,k,i,j,l,max,flag;  
	while(cin>>n>>k)  
	{  
		for(i=1;i<=n;i++)  
			cin>>num[i];  
		m[1][1]=num[1]-'0';  
		for(i=2;i<=n;i++)  
			m[i][1]=m[i-1][1]*10+(num[i]-'0'); //初始化第一列  
		for(j=2;j<=k;j++)//按列进行初始化  
		{  
			max=-1;  
			for(i=1;i<=n;i++)  
			{  
				if(j>i)  
					m[i][j]=0;  
				else  
				{  
					for(l=j-1;l<=i-1;l++)  
					{  
						flag=m[l][j-1]*atoi(num,l+1,i);  
						if(flag>max)  
						max=flag;  
					}  
					m[i][j]=max;  
				}  
			}  
		}  
		cout<<m[n][k]<<endl;  
	}  
	return 0;  
}  

//****************************************************************************

改进:对于atoi这个函数实现的功能可进行打表,这样可以加快程序运行速度

//****************************************************************************

    原文作者:动态规划
    原文地址: https://blog.csdn.net/momo_unique/article/details/23836739
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞