最佳加法表达式 百练4152

题目

在这里插入图片描述

代码

动态规划+大数加法

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define ME0(X) memset((X), 0, sizeof((X)))
using namespace std;
const int L=100;
string dp[100][100];
string add(string a,string b)//只限两个非负整数相加
{
    string ans;
    int na[L]= {0},nb[L]= {0};
    int la=a.size(),lb=b.size();
    for(int i=0; i<la; i++)
        na[la-1-i]=a[i]-'0';
    for(int i=0; i<lb; i++)
        nb[lb-1-i]=b[i]-'0';
    int lmax=la>lb?la:lb;
    for(int i=0; i<lmax; i++)
        na[i]+=nb[i],na[i+1]+=na[i]/10,na[i]%=10;
    if(na[lmax])
        lmax++;
    for(int i=lmax-1; i>=0; i--)
        ans+=na[i]+'0';
    return ans;
}
string mins(string a,string b)//判断大小
{
    if(a.length()<b.length())
        return a;
    else if(b.length()<a.length())
        return b;
    else
        return a<b?a:b;
}
int main()
{
    int m;
    string s;
    while(cin >> m >> s)
    {
        s=" "+s;
        int len=s.length();
        for(int i=0; i<=len; i++)
            dp[i][0]=s.substr(1,i);
        for(int j=1; j<=m; j++)
        {
            for(int i=0; i<=len; i++)
            {
                for(int x=j; x<i; x++)
                {
                  前x个数和"+"相等时,显然不成立,x个数最多有x-1个"+",所以要单独处理
                    if(x==j)
                        dp[i][j]=add(dp[x][j-1],s.substr(x+1,i-x));
//                    其他的情况,状态转移方程即可
                    else
                        dp[i][j]=mins(dp[i][j],add(dp[x][j-1],s.substr(x+1,i-x)));
                }
            }
        }
        cout << dp[len][m] << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dotJunz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值