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

    【题目描述】

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

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

    (1)3*12=36;

    (2)31*2=62;

    这时,符合题目要求的结果是:31*2=62。

    【输入描述】

    程序的输入共有两行。

    第一行共有2个自然数N、K(6 ≤ N ≤ 40,1 ≤ K ≤ 6);

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

    【输出描述】

    输出所求得的最大乘积(一个自然数)。

    【样例输入】

    4 2

    1231

    【样例输出】

    62

    源代码:
    
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,k,f[41][41]={0},sum[41][41]={0};
    string s;
    int main()
    {
        scanf("%d%d",&n,&k);
        cin>>s;
        s=" "+s;
        for (int a=1;a<=n;a++) //起点。
          for (int b=a;b<=n;b++) //终点。
          {
              int t=b-a;
              for (int c=0;c<t;c++)
              {
                long long v=1;
                for (int d=0;d<t-c;d++)
                  v*=10;
                sum[a][b]+=v*(s[a+c]-48);
              }
              sum[a][b]+=s[b]-48;
          } //求各个区间数。
        for (int a=1;a<=n;a++) //没有乘号的数都是原数。
          f[a][0]=sum[1][a];
        for (int b=1;b<=k;b++) //枚举乘号数量。
          for (int a=2;a<=n;a++) //枚举第几位数字。
            for (int c=1;c<a;c++) //枚举乘号位置求最大值。
                f[a][b]=f[a][b]>f[c][b-1]*sum[c+1][a]?f[a][b]:f[c][b-1]*sum[c+1][a]; //分区间法。
        printf("%d",f[n][k]);
        return 0;
    }
  • 相关阅读:
    An introduction to parsing text in Haskell with Parsec
    Kafka and ZooKeeper
    Kotlin + Anko for Android
    LibGDX
    OpenCV
    大中型网站技术实践系列
    Go by Example
    Benchmarks for the Top Server-Side Swift Frameworks vs. Node.js
    The Languages and Frameworks You Should Learn in 2017
    RabbitMQ
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5298093.html
Copyright © 2011-2022 走看看