CODE[VS]1017 乘积最大

题目: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;
}

猜你喜欢

转载自blog.csdn.net/QQ604666459/article/details/77870747