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

描述

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

输入

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

输出

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

样例输入

  1.  

样例输出

  1.  

提示

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

解题思路

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

AC代码一

  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. using namespace std;
  5. struct BigInt
  6. {
  7. int num[];
  8. int len;
  9. BigInt operator+(const BigInt & n) { //重载+,使得 a + b在 a,b都是 BigInt变量的时候能成立
  10. int ml = max(len,n.len);
  11. int carry = ; //进位
  12. BigInt result;
  13. for(int i = ;i < ml; ++i) {
  14. result.num[i] = num[i] + n.num[i] + carry;
  15. if( result.num[i] >= ) {
  16. carry = ;
  17. result.num[i] -= ;
  18. }
  19. else
  20. carry = ;
  21. }
  22. if ( carry == ) {
  23. result.len = ml + ;
  24. result.num[ml] = ;
  25. }
  26. else
  27. result.len = ml;
  28. return result;
  29. }
  30. bool operator<(const BigInt & n) {
  31. if( len > n.len )
  32. return false;
  33. else if( len < n.len)
  34. return true;
  35. else {
  36. for(int i = len -; i >= ; -- i) {
  37. if( num[i] < n.num[i])
  38. return true;
  39. else if( num[i] > n.num[i])
  40. return false;
  41. }
  42. return false;
  43. }
  44. }
  45. BigInt() {
  46. len = ;
  47. memset(num,,sizeof(num));
  48. }
  49. BigInt(const char * n,int L) { //由长度为L的char数组构造大整数。n里面的元素取值范围从 1-9。
  50. memset(num,,sizeof(num));
  51. len = L;
  52. for(int i = ; n[i]; ++i)
  53. num[len-i-] = n[i] - '';
  54. }
  55. };
  56. ostream & operator <<(ostream & o,const BigInt & n)
  57. {
  58.  
  59. for(int i = n.len - ;i >= ; --i)
  60. o << n.num[i];
  61. return o;
  62. }
  63. const int MAXN = ;
  64. char a[MAXN];
  65. BigInt Num[MAXN][MAXN];//Num[i][j]表示从第i个数字到第j个数字所构成的整数
  66. BigInt V[MAXN][MAXN]; //V[i][j]表示i个加号放到前j个数字中间,所能得到的最佳表达式的值。
  67. int main()
  68. {
  69. int m,n;
  70. BigInt inf; //无穷大
  71. inf.num[MAXN-] = ;
  72. inf.len = MAXN-;
  73.  
  74. while(cin >> m ) {
  75. cin >> a+;
  76. n = strlen(a+);
  77. for(int i = ;i <= n; ++i)
  78. for(int j = i;j<= n; ++j) {
  79. Num[i][j] = BigInt(a+i,j-i+);
  80. }
  81. for(int j = ; j <= n; ++j) {
  82. V[][j] = BigInt(a+,j);
  83. }
  84.  
  85. for(int i = ;i <= m; ++i) {
  86. for(int j = ; j <= n; ++j) {
  87. if( j - < i)
  88. V[i][j] = inf;
  89. else {
  90. BigInt tmpMin = inf;
  91. for(int k = i; k < j; ++k) {
  92. BigInt tmp = V[i-][k] + Num[k+][j];
  93. if (tmp < tmpMin)
  94. tmpMin = tmp;
  95. }
  96. V[i][j] = tmpMin;
  97. }
  98. }
  99. }
  100. cout << V[m][n] << endl;
  101. }
  102. return ;
  103. }

AC代码二

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <cmath>
  7. #include <queue>
  8. #include <set>
  9. #include <map>
  10. #include <list>
  11. #include <vector>
  12. #include <stack>
  13. #define mp make_pair
  14. //#define P make_pair
  15. #define MIN(a,b) (a>b?b:a)
  16. //#define MAX(a,b) (a>b?a:b)
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19. const int MAX=1e2+;
  20. const int INF=1e8+;
  21. using namespace std;
  22. //const int MOD=1e9+7;
  23. typedef pair<ll,int> pii;
  24. const double eps=0.00000001;
  25.  
  26. string add(string x,string y)
  27. {
  28. string re;
  29. int jin=;
  30. for(int i=x.length()-,j=y.length()-;i>=||j>=;i--,j--)
  31. {
  32. re=" "+re;
  33. re[]=(i>=?x[i]-'':)+(j>=?y[j]-'':)+jin;
  34. if(re[]>=)
  35. jin=,re[]=(re[]%)+'';
  36. else
  37. jin=,re[]=re[]+'';
  38. }
  39. if(jin)
  40. re=''+re;
  41. return re;
  42. }
  43. string mins(string x,string y)
  44. {
  45. if(x.length()<y.length())
  46. return x;
  47. else if(y.length()<x.length())
  48. return y;
  49. else return x<y?x:y;
  50. }
  51. int m;
  52. string x;
  53. string dp[][];
  54. int main()
  55. {
  56. while(~scanf("%d",&m))
  57. {
  58. cin>>x;
  59. int len=x.length();
  60. x=" "+x;
  61. for(int i=;i<=len;i++)
  62. dp[i][]=x.substr(,i);
  63. for(int j=;j<=m;j++)
  64. for(int i=j+;i<=len;i++)
  65. for(int s=j;s<i;s++)
  66. {
  67. if(s==j)
  68. dp[i][j]=add(dp[s][j-],x.substr(s+,i-s));
  69. else
  70. dp[i][j]=mins(dp[i][j],add(dp[s][j-],x.substr(s+,i-s)));
  71. }
  72. cout<<dp[len][m]<<"\n";
  73. }
  74. }

参考网址

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. 讨论---MySQL数据库中null、''、' '区别

    今天在写代码的时候,遇到了一个关于MySQL数据库的问题,发现在表中插入‘’数据的时候插入不进去.发现这张表中的数据没有数据的时候,默认显示的null,当时自己又重复的额试了几次,但是始终没有成功,从 ...

  2. MySQL入门篇之mysqldump备份和恢复

    一.备份单个数据库 1.备份命令:mysqldump MySQL数据库自带的一个很好用的备份命令.是逻辑备份,导出 的是SQL语句.也就是把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备 ...

  3. SpringBoot学习(五)RSocket和Security

    一.RSocket RSocket是一个用于字节流传输的二进制协议.它通过在单个连接上传递异步消息来支持对称交互模型,主要支持的通讯层包括 TCP, WebSockets和Aeron(UDP). RS ...

  4. 异常过滤器的好坏(CLR)

    为什么有些语言支持它们而另一些不支持呢?把它们加到我的新语言里是个好主意吗?我应该什么时候使用过滤器和catch/rethrow?就像很多事情一样,异常过滤器有好的一面也有坏的一面… 什么是异常过滤器 ...

  5. WinDbg的环境变量

    有很多的环境变量,主要分为常规环境变量和内核模式环境变量.下面分别列出. 常规环境变量 下表列出了可在用户模式和内核模式调试的环境变量. 变量 含义 _NT_DEBUGGER_EXTENSION_PA ...

  6. mac百度网盘破解版

    以下资源来源于网络收集分享,如有问题请联系我删除!来源入口,后面链接挂了,可去原网址访问! 还在为Mac百度网盘下载速度慢而烦恼吗?百度云盘又是一个非常实用的分享工具,可支持图片.视频.音乐.文档.种 ...

  7. 当变量超过任意设定的变量限制时终止fluent模拟【翻译】

    一些时候某个特定的变量(压力,速度,温度等)发散会造成不合理的计算结果.在许多算例,当变量超过某些合理的限制时,自动停止/打断模拟是有帮助的. 解决方法是联合UDF和scheme文件.UDF将会遍历所 ...

  8. Monkey框架(基础知识篇) - monkey启动与参数介绍

    一.monkey启动 直接PC启动:> adb shell monkey [options] <count> shell 端启动:> adb shell >monkey ...

  9. /usr/bin/xauth: file /home/user/.Xauthority does not exist

    错误信息如下: /usr/bin/xauth: file /home/user/.Xauthority does not exist 错误原因:是因为添加用户时没有授权对应的目录,仅仅执行了usera ...

  10. Pygame 贪吃蛇

    目录 代码 遇到的问题 参考 代码 #-*-encoding=utf-8-*- # Wormy(a Nibbles clone) # By Al Sweigart al@inventwithpytho ...