OpenJudge 4152 最佳加法表达式
总时间限制: 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 最佳加法表达式的更多相关文章
- 百练4152:最佳加法表达式(dp+高精度)
描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36 输入有不超 ...
- OpenJ_Bailian - 4152 最佳加法表达式 dp
http://bailian.openjudge.cn/practice/4152?lang=en_US 题解 :dp[i][j]代表前i个字符加j个加号可以得到的最小值,于是dp[i+k[j+1]可 ...
- 【OpenJ_Bailian - 4152 】最佳加法表达式(动态规划)
最佳加法表达式 Descriptions: 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆 ...
- dp 动规 最佳加法表达式
最佳加法表达式 有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少 解题思路 假定数字串长度是n,添完加号后,表达式的最后一个加号 ...
- 【动态规划】最佳加法表达式(百练oj4152)
总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...
- 最佳加法表达式(dp)
题目描述: 有一个由1..9组成的数字串.问如果将m个加 号插入到这个数字串中,在各种可能形成的 表达式中,值最小的那个表达式的值是多少 (本题只能用于整数) 解题思路: 假定数字串长度是n,添完加号 ...
- 递推,动态规划(DP),字符串处理,最佳加法表达式
看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ...
- java源码——0~9十个数字不重复地使用使加法表达式成立
这个问题是在我写个的几个博客里较为复杂的一个.首先,先看看整个问题的表述. 星号表示0~9的一个数字,而且不允许重复,使得下面的加法表达式成立.输出所有结果. ※ ※ ※ ※ ※ + 2 ...
- OpenJudge 2694 逆波兰表达式
1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...
随机推荐
- 讨论---MySQL数据库中null、''、' '区别
今天在写代码的时候,遇到了一个关于MySQL数据库的问题,发现在表中插入‘’数据的时候插入不进去.发现这张表中的数据没有数据的时候,默认显示的null,当时自己又重复的额试了几次,但是始终没有成功,从 ...
- MySQL入门篇之mysqldump备份和恢复
一.备份单个数据库 1.备份命令:mysqldump MySQL数据库自带的一个很好用的备份命令.是逻辑备份,导出 的是SQL语句.也就是把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备 ...
- SpringBoot学习(五)RSocket和Security
一.RSocket RSocket是一个用于字节流传输的二进制协议.它通过在单个连接上传递异步消息来支持对称交互模型,主要支持的通讯层包括 TCP, WebSockets和Aeron(UDP). RS ...
- 异常过滤器的好坏(CLR)
为什么有些语言支持它们而另一些不支持呢?把它们加到我的新语言里是个好主意吗?我应该什么时候使用过滤器和catch/rethrow?就像很多事情一样,异常过滤器有好的一面也有坏的一面… 什么是异常过滤器 ...
- WinDbg的环境变量
有很多的环境变量,主要分为常规环境变量和内核模式环境变量.下面分别列出. 常规环境变量 下表列出了可在用户模式和内核模式调试的环境变量. 变量 含义 _NT_DEBUGGER_EXTENSION_PA ...
- mac百度网盘破解版
以下资源来源于网络收集分享,如有问题请联系我删除!来源入口,后面链接挂了,可去原网址访问! 还在为Mac百度网盘下载速度慢而烦恼吗?百度云盘又是一个非常实用的分享工具,可支持图片.视频.音乐.文档.种 ...
- 当变量超过任意设定的变量限制时终止fluent模拟【翻译】
一些时候某个特定的变量(压力,速度,温度等)发散会造成不合理的计算结果.在许多算例,当变量超过某些合理的限制时,自动停止/打断模拟是有帮助的. 解决方法是联合UDF和scheme文件.UDF将会遍历所 ...
- Monkey框架(基础知识篇) - monkey启动与参数介绍
一.monkey启动 直接PC启动:> adb shell monkey [options] <count> shell 端启动:> adb shell >monkey ...
- /usr/bin/xauth: file /home/user/.Xauthority does not exist
错误信息如下: /usr/bin/xauth: file /home/user/.Xauthority does not exist 错误原因:是因为添加用户时没有授权对应的目录,仅仅执行了usera ...
- Pygame 贪吃蛇
目录 代码 遇到的问题 参考 代码 #-*-encoding=utf-8-*- # Wormy(a Nibbles clone) # By Al Sweigart al@inventwithpytho ...