最佳乘法问题

来源:互联网 发布:企业it解决方案 编辑:程序博客网 时间:2024/06/08 15:32

题目描述
给一个长度为 n的数字串,只包含数字0-9,现在让你在这个串中间插入 k 个乘号,
将数字串分为k+1 个部分,使得这k+1个数字的乘积最大。
输入
字符串 k
输出
乘法结果
示例
312 1
62
解题思路
p【m】【n】表示前m个字符中插入n个乘号的最大值,p【m+1】【n】=max{p【i】【n】+num(i+1,n)},相当于在i和i+1之间插入了一个乘号

#include<iostream>#include<string>#include<stdlib.h>using namespace std;typedef long long int LL;const LL INF=-100000;int main() {    string s;    cin>>s;    int k;    cin>>k;    LL p[s.length()+1][k+1]={0};    for (int i=1;i<=s.length();++i)    {        p[i][0]=atoi(s.substr(0,i).c_str());    }    for (int m=1;m<=s.length();++m)    {        for (int n=1;n<=k;++n)        {            cout<<"m="<<m<<"n="<<n<<" "<<p[m][n]<<endl;            if (n>m-1)                p[m][n]=INF;            else{                for (int i=n;i<=m-1;++i){                    if (p[m][n]<p[i][n-1]+atoi(s.substr(i,m-1).c_str()))                    {                        p[m][n]=p[i][n-1]+atoi(s.substr(i,m-1).c_str());                    }                }            cout<<"m="<<m<<"n="<<n<<" "<<p[m][n]<<endl;             }        }    }    cout<<p[s.length()][k]<<endl;}
原创粉丝点击