1. 程式人生 > >南郵 OJ 1235 最大k乘積問題

南郵 OJ 1235 最大k乘積問題

最大k乘積問題

時間限制(普通/Java) : 1000 MS/ 3000 MS          執行記憶體限制 : 65536 KByte
總提交 : 138            測試通過 : 17 

比賽描述

I是一個n位十進位制整數。如果將I劃分為k段,則可得到k個整數。這k個整數的乘積稱為I的一個k乘積。試設計一個演算法,對於給定的Ik,求出I的最大k乘積。

對於給定的Ik,程式設計計算I的最大k乘積。



輸入

輸入的第1行中有2個正整數nk。正整數n是序列的長度;正整數k是分割的段數。接下來的一行中是一個n位十進位制整數。(n<=10

輸出

輸出計算結果,第1行中的數是計算出的最大

k乘積。

樣例輸入

2 1
15

樣例輸出

15

提示

undefined

題目來源

演算法設計與實驗題解



//dp[i][j]:從第1為到第i位構成的數字,華為j段,構成的最大乘積,i∈[1,n],j∈[1,n]
//num[i][j]:從第i位到第j位組成的數字,1<=i<=j<=n
#include<stdio.h>
#define N 11
int main(){
	int n,k,i,j,r;
	long dp[N][N],temp;
	long num[N][N];
	char c[N];
	scanf("%d%d",&n,&k);
	scanf("%s",c);
	for(i=1;i<=n;i++){
		num[i][i] = c[i-1]-'0';
		for(j=i+1;j<=n;j++){
			num[i][j] = num[i][j-1]*10 + c[j-1] - '0';
		}
	}
	for(i=1; i<=n; i++){
		dp[i][1] = num[1][i];
	}
	for(i=2; i<=n; i++){
		for(j=2; j<=i && j<=k; j++){
			dp[i][j]=0;
			for(r=j-1; r<=i-1; r++){
				if( (temp=dp[r][j-1]*num[r+1][i]) > dp[i][j] ){
					dp[i][j] = temp;
				}
			}
		}
	}
	printf("%ld",dp[n][k]);
}