1. 程式人生 > >乘法最大 動態規劃

乘法最大 動態規劃

給一個長度為 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;
}