题目:http://codevs.cn/problem/1017/
思路:将N个字符分割为K个数并相乘,可划分为M个字符组成的数,乘以将N-M的字符分割为K-1个数。
题解:
/* 1017 乘积最大 */
#include <stdio.h>
#define DEBUG
#define toint(X) (X-'0') /* 将字符转换为整型 */
#define MAXN 41 /* 最大字符串长度 */
#define MAXK 7 /* 最大分割数 */
int k, n; /* 长度,分割数 */
int ksize[MAXK]; /* 分割长度 */
char str[MAXN]; /* 字符串 */
long long max; /* 最大乘积 */
/* 获取截取的值 */
int get_val(int start, int len){
int i;
int n = toint(str[start]);
for(i = 1; i < len; i++){
n = n * 10 + toint(str[start + i]);
}
return n;
}
/* 计算各种分割方案下的乘积 */
void div_str(int remain, int depth){
int i, j; /* 索引值 */
int pos; /* 当前分割点 */
long long m; /* 当前乘积值 */
/* 从剩余字符串中选择j个组成整数 */
for(j = 1; j <= remain - depth; j++){
/* 记录分割长度,并更新剩余长度 */
ksize[depth] = j;
remain = remain - j;
/* 判断是否已满足分割数要求 */
if(depth == 0){
/* 将剩余字符数添加到最后一个分割值 */
ksize[depth] = remain + ksize[depth];
m = 1;
pos = 0;
/* 计算当前分割方案的乘积,并更新最大乘积 */
for(i = 0; i <= k; i++){
m = m * get_val(pos, ksize[i]);
pos = pos + ksize[i];
if(m == 0){
break;
}
}
if(m > max){
max = m;
}
break;
}
/* 未分割指定数量的数字,用剩余字符串继续分割 */
else{
div_str(remain, depth - 1);
}
/* 还原剩余字符长度 */
remain = remain + j;
}
}
/* 主函数入口 */
int main(int argc, char *argv[]) {
#ifdef DEBUG
FILE *fp;
if(NULL == (fp = fopen("data.txt", "r"))){
return 1;
}
#endif
/* 获取总长度,和分割数 */
#ifdef DEBUG
fscanf(fp, "%d %d", &n, &k);
#else
scanf("%d %d", &n, &k);
#endif
/* 获取字符串 */
#ifdef DEBUG
fscanf(fp, "%s", str);
#else
scanf("%s", str);
#endif
/* 分割字符串 */
div_str(n, k);
printf("%lld", max);
#ifdef DEBUG
fclose(fp);
#endif
return 0;
}