zoukankan      html  css  js  c++  java
  • P1018 乘积最大

    题目描述
    今年是国际数学联盟确定的“ 2000 ――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 90 周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 XZ 也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:

    设有一个长度为 NN 的数字串,要求选手使用 KK 个乘号将它分成 K+1K+1 个部分,找出一种分法,使得这 K+1K+1 个部分的乘积能够为最大。

    同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:

    有一个数字串:312312, 当 N=3,K=1N=3,K=1 时会有以下两种分法:

    3 imes 12=363×12=36
    31 imes 2=6231×2=62
    这时,符合题目要求的结果是: 31 imes 2 = 6231×2=62

    现在,请你帮助你的好朋友 XZ 设计一个程序,求得正确的答案。

    输入格式
    程序的输入共有两行:

    第一行共有 22 个自然数 N,KN,K(6≤N≤40,1≤K≤66≤N≤40,1≤K≤6)

    第二行是一个长度为 NN 的数字串。

    输出格式
    结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数)。

    输入输出样例
    输入 #1复制
    4 2
    1231
    输出 #1复制
    62
    说明/提示
    NOIp2000提高组第二题

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    
    const int maxbit = 205;
    struct BigInt
    {
        int a[maxbit], len;
        void print()
        {
            for(int i = len - 1; i >= 0; i--)
            {
                printf("%d", a[i]);
            }
            //printf("
    ");
        }
        void init(char *ch)
        {
            memset(a, 0, sizeof(a));
            len = strlen(ch);
            for(int i = len - 1; i >= 0; i--) a[len - i - 1] = ch[i] - '0';
        }
        BigInt operator * (const BigInt rhs) const
        {
            BigInt ans;
            memset(ans.a, 0, sizeof(ans.a));
            ans.len = len + rhs.len;
            for(int i = 0; i < len; i++)
            {
                for(int j = 0; j < rhs.len; j++)
                {
                    ans.a[i + j] += a[i] * rhs.a[j];
                    if(ans.a[i + j] >= 10)
                    {
                        ans.a[i + j + 1] += ans.a[i + j] / 10;
                        ans.a[i + j] %= 10;
                    }
                }
            }
            while(ans.len - 1 > 0 && ans.a[ans.len - 1] == 0) ans.len--;
            return ans;
        }
        bool operator < (const BigInt rhs) const
        {
            if(len > rhs.len) return false;
            else if(len < rhs.len) return true;
            for(int i = len - 1; i >= 0; i--)
            {
                if(a[i] > rhs.a[i]) return false;
                else if(a[i] < rhs.a[i]) return true;
            }
            return false;
        }
    };
    
    BigInt dp[50][10];
    BigInt sp[50][50];
    BigInt Std;
    int n, m;
    
    BigInt split(int s, int t)
    {
        BigInt ans;
        ans.len = t - s + 1;
        for(int i = s; i <= t; i++)
        {
            ans.a[i - s] = Std.a[i];
        }
        return ans;
    }
    
    char temp[maxbit];
    int main()
    {
        scanf("%d%d", &n, &m);
        scanf("%s", temp);
        Std.init(temp);
        for(int i = 0; i < n; i++)
        {
            for(int j = i; j < n; j++)
            {
                sp[i][j] = split(i, j);
                //sp[i][j].print(); printf("
    ");
            }
        }
        for(int i = 0; i < n; i++) dp[i][0] = sp[0][i];
        for(int i = 0; i < n; i++)
        
        {
            for(int j = 1; j <= m; j++)
            {
                for(int k = 0; k < i; k++)
                {
                    BigInt temp1 = dp[i][j];
                    //temp1.print(); printf("
    ");
                    BigInt temp2 = dp[k][j - 1] * sp[k + 1][i];
                    //temp2.print(); printf("
    ");
                    dp[i][j] = std::max(dp[i][j], dp[k][j - 1] * sp[k + 1][i]);
                }
            }
        }
        dp[n - 1][m].print();
        return 0;
    }
    
  • 相关阅读:
    Stalstack 连接管理配置
    Stalstack 安装
    Apache 错误整理
    Apache 服务常用命令
    Apache 优化
    Shell 常用技巧
    Nginx+keepalived做双机热备加tomcat负载均衡
    用Lighttpd做图片服务器
    rsync是类unix系统下的数据镜像备份工具
    redis+keeplived分布式缓存
  • 原文地址:https://www.cnblogs.com/xmcword/p/13798587.html
Copyright © 2011-2022 走看看