总时间限制: 1000ms 内存限制: 65536kB

描述

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

输入

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

输出

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

样例输入


样例输出


提示

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

解题思路

主要难点在高精度计算,以下提供两种解法,码着日后研究。

AC代码一

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
struct BigInt
{
int num[];
int len;
BigInt operator+(const BigInt & n) { //重载+,使得 a + b在 a,b都是 BigInt变量的时候能成立
int ml = max(len,n.len);
int carry = ; //进位
BigInt result;
for(int i = ;i < ml; ++i) {
result.num[i] = num[i] + n.num[i] + carry;
if( result.num[i] >= ) {
carry = ;
result.num[i] -= ;
}
else
carry = ;
}
if ( carry == ) {
result.len = ml + ;
result.num[ml] = ;
}
else
result.len = ml;
return result;
}
bool operator<(const BigInt & n) {
if( len > n.len )
return false;
else if( len < n.len)
return true;
else {
for(int i = len -; i >= ; -- i) {
if( num[i] < n.num[i])
return true;
else if( num[i] > n.num[i])
return false;
}
return false;
}
}
BigInt() {
len = ;
memset(num,,sizeof(num));
}
BigInt(const char * n,int L) { //由长度为L的char数组构造大整数。n里面的元素取值范围从 1-9。
memset(num,,sizeof(num));
len = L;
for(int i = ; n[i]; ++i)
num[len-i-] = n[i] - '';
}
};
ostream & operator <<(ostream & o,const BigInt & n)
{ for(int i = n.len - ;i >= ; --i)
o << n.num[i];
return o;
}
const int MAXN = ;
char a[MAXN];
BigInt Num[MAXN][MAXN];//Num[i][j]表示从第i个数字到第j个数字所构成的整数
BigInt V[MAXN][MAXN]; //V[i][j]表示i个加号放到前j个数字中间,所能得到的最佳表达式的值。
int main()
{
int m,n;
BigInt inf; //无穷大
inf.num[MAXN-] = ;
inf.len = MAXN-; while(cin >> m ) {
cin >> a+;
n = strlen(a+);
for(int i = ;i <= n; ++i)
for(int j = i;j<= n; ++j) {
Num[i][j] = BigInt(a+i,j-i+);
}
for(int j = ; j <= n; ++j) {
V[][j] = BigInt(a+,j);
} for(int i = ;i <= m; ++i) {
for(int j = ; j <= n; ++j) {
if( j - < i)
V[i][j] = inf;
else {
BigInt tmpMin = inf;
for(int k = i; k < j; ++k) {
BigInt tmp = V[i-][k] + Num[k+][j];
if (tmp < tmpMin)
tmpMin = tmp;
}
V[i][j] = tmpMin;
}
}
}
cout << V[m][n] << endl;
}
return ;
}

AC代码二

#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <vector>
#include <stack>
#define mp make_pair
//#define P make_pair
#define MIN(a,b) (a>b?b:a)
//#define MAX(a,b) (a>b?a:b)
typedef long long ll;
typedef unsigned long long ull;
const int MAX=1e2+;
const int INF=1e8+;
using namespace std;
//const int MOD=1e9+7;
typedef pair<ll,int> pii;
const double eps=0.00000001; string add(string x,string y)
{
string re;
int jin=;
for(int i=x.length()-,j=y.length()-;i>=||j>=;i--,j--)
{
re=" "+re;
re[]=(i>=?x[i]-'':)+(j>=?y[j]-'':)+jin;
if(re[]>=)
jin=,re[]=(re[]%)+'';
else
jin=,re[]=re[]+'';
}
if(jin)
re=''+re;
return re;
}
string mins(string x,string y)
{
if(x.length()<y.length())
return x;
else if(y.length()<x.length())
return y;
else return x<y?x:y;
}
int m;
string x;
string dp[][];
int main()
{
while(~scanf("%d",&m))
{
cin>>x;
int len=x.length();
x=" "+x;
for(int i=;i<=len;i++)
dp[i][]=x.substr(,i);
for(int j=;j<=m;j++)
for(int i=j+;i<=len;i++)
for(int s=j;s<i;s++)
{
if(s==j)
dp[i][j]=add(dp[s][j-],x.substr(s+,i-s));
else
dp[i][j]=mins(dp[i][j],add(dp[s][j-],x.substr(s+,i-s)));
}
cout<<dp[len][m]<<"\n";
}
}

参考网址

https://blog.csdn.net/qq_43472263/article/details/88652211

https://www.cnblogs.com/huashanqingzhu/p/8097787.html

OpenJudge 4152 最佳加法表达式的更多相关文章

  1. 百练4152:最佳加法表达式(dp+高精度)

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

  2. OpenJ_Bailian - 4152 最佳加法表达式 dp

    http://bailian.openjudge.cn/practice/4152?lang=en_US 题解 :dp[i][j]代表前i个字符加j个加号可以得到的最小值,于是dp[i+k[j+1]可 ...

  3. 【OpenJ_Bailian - 4152 】最佳加法表达式(动态规划)

    最佳加法表达式 Descriptions: 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆 ...

  4. dp 动规 最佳加法表达式

    最佳加法表达式 有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少 解题思路 假定数字串长度是n,添完加号后,表达式的最后一个加号 ...

  5. 【动态规划】最佳加法表达式(百练oj4152)

    总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...

  6. 最佳加法表达式(dp)

    题目描述: 有一个由1..9组成的数字串.问如果将m个加 号插入到这个数字串中,在各种可能形成的 表达式中,值最小的那个表达式的值是多少 (本题只能用于整数) 解题思路: 假定数字串长度是n,添完加号 ...

  7. 递推,动态规划(DP),字符串处理,最佳加法表达式

    看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ...

  8. java源码——0~9十个数字不重复地使用使加法表达式成立

    这个问题是在我写个的几个博客里较为复杂的一个.首先,先看看整个问题的表述. 星号表示0~9的一个数字,而且不允许重复,使得下面的加法表达式成立.输出所有结果. ※ ※ ※ ※ ※    +  2   ...

  9. OpenJudge 2694 逆波兰表达式

    1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...

随机推荐

  1. CodeForces - 76F:Tourist (旋转坐标系,LIS)

    pro:有一个驴友,以及给定N个表演地点xi和时间ti,驴友的速度不能超过V. 问他在起点为原点和不设置起点的情况下分别最多参观多少个表演. sol:BZOJ接飞饼见过:clari也在camp的DP专 ...

  2. MySql数据封装操作类

    1.先引用MySQL的DLL文件 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  3. 持续集成学习9 jenkins执行脚本

    一.配置 1.首先在slave节点上写一脚本 [root@node1 script]# cat /application/script/test.sh #!/bin/bash echo "h ...

  4. “OKR播种机”JOHN DOERR–目标是对抗纷乱思绪的一针疫苗

    OKR培养出疯狂的想法,再加上对的人,奇迹就会出现 约翰·杜尔是美国最有影响力.最具创意.最不拘传统的冒险资本投资家之一.在短短10年内创造了高达1,000亿美元的经济价值.迄今为止,他已向 250家 ...

  5. JavaScript开发——文件夹的上传和下载

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  6. 关于System.AccessViolationException异常

    什么是AccessViolationException 试图读写受保护内存时引发的异常. 继承 Object Exception SystemException AccessViolationExce ...

  7. 浏览器端使用less

    一.思路 ①less无法在浏览器中直接使用,浏览器不能识别 ②通过less解析插件less.js(JavaScript插件)可以把less文件解析成css代码(下载地址) 二.具体应用 ①less.j ...

  8. 洛谷 P2312 解方程 题解

    P2312 解方程 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 [1,m][1,m] 内的整数解(\(n\) 和 \(m\) 均为 ...

  9. log4j 1.2 配置和使用简述

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/log4j_properties_simple_introduct ...

  10. 因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题

    背景描述 因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B.C.D引用到).但是这个 ...