P1018 [NOIP2000 提高组] 乘积最大

P1018 [NOIP2000 提高组] 乘积最大

这道题呢,按我当前的方法只得了60分,有几个超过long long的数据没办法处理,需要用到高精度,等我回头学习一下,再来补充~先记录一下现在的思路,仅供参考

首先还是来看一下题目~

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

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

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

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

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

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

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

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

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

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

思路

其实刚看到这道题时,我是没有想到动态规划的,因为我真的看不出来怎么就是动态规划了
菜鸡看了很久,没找到合理的解决办法,看了看这道题的标签,喔~动态规划
然而,依旧不知道方程何在。。。我是辣鸡
最后呢,我去看了看别人的题解,哦豁,有点复杂,没有接受,根据别人讲的思路,再加上一点点我自己的想法,产生了下面的代码,自认为还是比较好懂的~~
那我们开始吧~
我们先来看一个这个动态规划方程要怎么写

dp[n][k]=max(dp[i][k-1]*tip[i+1][n],i∈[k,n))

其中,dp[n][k]为前n个数字用了k个乘号时的最大值
tip[i][j]为第i位到第j位组成的数字
这个方程解释下来呢是这样子的:我们以第i位数字为划分点(i位置不固定,这也是不同于普通动态规划方程的地方,反正我是觉得不太好想,我看了好久要怎么实现。。。)整体用了k个乘号,第i位后放了一个,那么还剩k-1个,则全部放在前i个字符内部(具体在哪不用管,这也是动态规划的思想),那么从第i+1位开始到最后一位就是没乘号了,则为一个数字,这个数字就是tip[i+1][n]:即为第i+1位到第n位组成的数字。
有了这个思想之后呢,我们只要用i遍历整个数组,取出最大值作为当前dp的结果即可。
步骤
所以第一步我们需要对输入字符串或字符数组进行处理,得到tip[i][j]。
(当然要先把字符数组转成int型)

long long tip[n+1][n+1];//tip[i][j]为第i位到第j位组成的数字
    memset(tip,0,sizeof(tip));

    for(int i=n;i>0;i--)
    {
        for(int j=n;j>0;j--)
        {
            if(i<=j)
            {
                int num=j;
                long long k=1;
                while(num>=i)
                {
                    tip[i][j]+=k*a[num];
                    k*=10;
                    num--;
                }

            }

        }
    }

得到tip[i][j]之后就是dp[i][j]了
首先是dp[i][0]:这也就是不放乘号的情况,即

for(int i=1;i<=n;i++)
    {
        dp[i][0]=tip[1][i];
    }

而其他的普通情况就要动态规划老办法:两层for循环控制dp[i][j],但是这个题不同的点在于,每一个dp[i][j]又是一个循环比较的过程,所以我们又要加一层for循环
(呃,我语言能力可能差劲。。。还是看代码吧,呼~)

long long maxn=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j

这样得到的dp[i][j]就是前i位用了j个乘号的最大值,那么dp[n][k]即为我们所求了。
我的这个辣鸡代码只能AC六个数据,还有四个比long long还大的数据需要用到高精度,等我恶补一下再来补充~

你可能感兴趣的:(动态规划,c++)