最佳加法表达式 + 高精度

本文探讨了在一组数字间放置加号以形成最小加法表达式的算法问题。通过动态规划方法,结合高精度计算技巧,实现了对大量数据的有效处理。文章详细介绍了使用字符串模拟进行大数比较和加法的过程。

本题来源:MOOC郭炜老师算法学习练习

最佳加法表达式

问题重述

给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值。例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36

输入
有不超过15组数据
每组数据两行。第一行是整数m,表示有m个加号要放( 0<=m<=50)
第二行是若干个数字。数字总数n不超过50,且 m <= n-1

输出
对每组数据,输出最小加法表达式的值

样例输入
2
123456
1
123456
4
12345
样例输出
102
579
15

提示
要用到高精度计算,即用数组来存放long long 都装不下的大整数,并用模拟列竖式的办法进行大整数的加法。

思路分析:

还是比较规范的动态规划算法题,我们设定当前状态是 ans[n][m] 表示前 n 个数里放入 m 个加号后所能得到的最小值。状态转移就是 ans[n][m]=min(ans[n][m],ans[i][m-1]+temp) ,其中 ans[n][m] 表示我们要求的当前状态, ans[i][m-1] 表示要从哪些状态转移过来,i 的取值有多种我们要保证前 i 个数能放下 m-1 个加号且 i 之后还要有数即 temp 我们要计算每一种可能所以加号能放的位置要全部遍历。但因为数据太大我们要用到高精度算法,这里的运算我们都要重新定义我们需要的运算有比较大小和相加运算,一开始我用数组模拟大数的相加和比较后来发现过于麻烦(也是因为我水平不够),后来想到字符串的方法较多便又用了字符串模拟,发现较简洁。

C++代码:
#include<iostream>
#include<cstring>
using namespace std;
string s;//表示每次要处理的大数 
string ans[52][52];//定义一个答案数组存储前n个数里放入m个加号后所能得到的最小值 
void init()//初始化答案数组 
{
   
   
	for(int i=0;i<52;i++)
		for(int j=0;j<52;j++)
			ans[i][j]="";
}
string mins(string a,string b)//高精度字符串模拟比较大小 
{
   
   
	if(<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值