乘法最大 动态规划

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/amazingcode/article/details/79680395

给一个长度为 nn 的数字串,只包含数字0-9,现在让你在这个串中间插入 k 个乘号,将数字串分为 k+1个部分,使得这 k+1个数字的乘积最大。比如数字串为"312"k=1 的时候有 2 种插入方法。3∗12=36和 31∗2=62,所以答案为 62

试编程求解"98712365409451502137"中插入 10个乘号的最大乘积。注意答案超过了 int 的范围,需要用到 long long 类型。由于结果太大,使用 Java 的同学建议用字符串的方式输出。

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=50;
char s[maxn];
long long ans[maxn][15];
int n,k;
long long change(int x,int y)
{
    long long ret=0;
    for(int i=x;i<=y;i++)
    {
        ret=ret*10+(s[i]-'0');
    }
    return ret;
}
void dp()
{
    for(int i=1;i<=k;i++)
        for(int j=1;j<=n;j++)
            for(int m=1;m<=j;m++)
                if(ans[m][i-1]*change(m+1,j)>ans[j][i])
                    ans[j][i]=ans[m][i-1]*change(m+1,j);
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
        ans[i][0]=change(1,i);
    }
    dp();
    printf("%lld\n",ans[n][k]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/amazingcode/article/details/79680395