http://bailian.openjudge.cn/practice/4152?lang=en_US

题解 :dp[i][j]代表前i个字符加j个加号可以得到的最小值,于是dp[i+k[j+1]可以由dp[i][j]得到。具体转移方程看代码。

   然后数字是50位所以要用高精度类。自己写了一个

坑:高精度的<和+有bug。一开始的更新方法也在乱写

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<iostream>
  5. #include<string>
  6. #include<vector>
  7. #include<algorithm>
  8. #include<string.h>
  9. using namespace std;
  10. const int N = + ;
  11.  
  12. typedef long long ll;
  13. struct BigInterger {
  14. static const int BASE = 1e8;
  15. static const int WIDTH = ;
  16. vector<int> s;
  17. BigInterger(long long num = ) { *this = num; }
  18. BigInterger operator =(long long num) {
  19. s.clear();
  20. do {
  21. s.push_back(num%BASE);
  22. num /= BASE;
  23. } while (num > );//num==0
  24. return *this;
  25. }
  26. BigInterger operator =(const string& str) {
  27. s.clear();
  28. int x, len = (str.length() - ) / WIDTH + ;//len==width
  29. for (int i = ; i < len; i++) {
  30. int end = str.length() - i*WIDTH;
  31. int start = max(, end - WIDTH);
  32. sscanf(str.substr(start, end - start).c_str(), "%d", &x);
  33. s.push_back(x);
  34. }
  35. return *this;
  36. }
  37.  
  38. BigInterger operator +(const BigInterger& b)const {
  39. BigInterger c;
  40. c.s.clear();
  41. for (int i = , g = ;; i++) {
  42. if (g == && i >= max(s.size(), b.s.size()))break;
  43. int x = g;
  44. if (i < s.size())x += s[i];
  45. if (i < b.s.size()) x += b.s[i];
  46. c.s.push_back(x%BASE);
  47. g = x / BASE;
  48. }
  49. return c;
  50. }
  51. BigInterger operator +=(const BigInterger& b) {
  52. *this = *this + b; return *this;
  53. }
  54.  
  55. bool operator<(const BigInterger& b)const {
  56. if (s.size() != b.s.size()) return s.size() < b.s.size();
  57. for (int i = s.size() - ; i >= ; i--) {
  58. if (s[i] != b.s[i]) return s[i] < b.s[i];//Width 个数字一起比
  59. }
  60. return false;//==
  61. }
  62. bool operator>(const BigInterger &b)const { return b < *this; }
  63. bool operator<=(const BigInterger &b)const { return !(b < *this); }
  64. bool operator>=(const BigInterger &b)const { return !(*this < b); }
  65. bool operator!=(const BigInterger &b)const { return b < *this || *this<b; }
  66. bool operator==(const BigInterger &b)const { return!(b < *this) && !(*this<b); }
  67. };
  68. ostream& operator <<(ostream &out, const BigInterger& x) {
  69. out << x.s.back();
  70. for (int i = x.s.size() - ; i >= ; i--) {
  71. char buf[];
  72. sprintf(buf, "%08d", x.s[i]);
  73. for (int j = ; j < strlen(buf); j++)cout << buf[j];
  74. }
  75. return out;
  76. }
  77. istream&operator>>(istream &in, BigInterger&x) {
  78. string s;
  79. if (!(in >> s))return in;
  80. x = s;
  81. return in;
  82. }
  83. BigInterger dp[N][N];//前i个数加j个加号的最小值。
  84. int main() {
  85. int n; BigInterger s; string s1;
  86. string INF;
  87. for (int i = ; i < ; i++)INF += "";
  88. while (cin >> n) {
  89. cin >> s1;
  90. int len = s1.length();
  91. s = s1;
  92. //if (n == 0) {cout << s<<endl; continue;}
  93. for (int i = ; i <= len; i++)
  94. for (int j = ; j <= n; j++) dp[i][j] = INF;
  95.  
  96. for (int i = ; i <= len; i++)
  97. for (int j = ; j <= n; j++) {
  98. if (j == ) { dp[i][j] = s1.substr(, i); }
  99. else if (i < j + ) dp[i][j] = INF;
  100. else {
  101. for (int k = j; k <= i - ; k++) {
  102. BigInterger x;
  103. x = s1.substr(k, i - k);
  104. dp[i][j] = min(dp[i][j], dp[k][j - ] + x);
  105. }
  106. }
  107. //cout <<i<<j<<' '<< dp[i][j] << endl;
  108. }
  109. cout << dp[len][n] << endl;
  110.  
  111. }
  112. }

OpenJ_Bailian - 4152 最佳加法表达式 dp的更多相关文章

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

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

  2. OpenJudge 4152 最佳加法表达式

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [JSOI2016] 最佳团队 (树形DP+01分数规划)

    Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. 每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...

随机推荐

  1. C#中的Abstract、Virtual、Interface理解

    容易混淆是必须的,都是与继承有关系,并且涉及到override的使用 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中 ...

  2. 导入贴图操作:处理贴图MaxSize和Format

    using UnityEngine; using System.Collections; using UnityEditor; public class ImportModflyTextures : ...

  3. 自己搭建CDN服务器静态内容加速-LuManager CDN使用教程

    为什么要自己来搭建一个CDN服务器实现网站访问加速?一是免费CDN服务稳定性和加速效果都不怎么行:二是用国内的付费CDN服务价格贵得要死,一般的草根站长无法承受:三是最现实的问题国内的CDN要求域名B ...

  4. [转]logging使用

    来源:https://www.cnblogs.com/nancyzhu/p/8551506.html日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事 ...

  5. codeforces水题100道 第十三题 Codeforces Round #166 (Div. 2) A. Beautiful Year (brute force)

    题目链接:http://www.codeforces.com/problemset/problem/271/A题意:给你一个四位数,求比这个数大的最小的满足四个位的数字不同的四位数.C++代码: #i ...

  6. iOS - 转场时 appear 与 disappear 的调用顺序探索

    不同的转场方式 A.B viewDidDisappear调用的流程不同 在A页面跳转到B页面的过程中 A 的 viewDidDisappear 方法和 B 的 viewDidAppear 谁先调用? ...

  7. php安装xdebug后var_dump输出没有格式化的问题

    开发环境,装了一个xdebug扩展方便调试代码. 但是环境配置好了之后却发现xdebug加载成功了但是var_dump输出的内容却没有使用html格式化 这时想到估计是php.ini里面的某个输出的配 ...

  8. Android设置横屏竖屏

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FUL ...

  9. 【大数据系列】在windows下连接linux 下的hadoop环境进行开发

    一.下载Eclipse并安装 二.下载exlipse的hadoop plugin 三.打开Map Reduce视图 Window --> Perspective --> Open pers ...

  10. vue案例 - 使用vue实现自定义多选与单选的答题功能

    4月底立得flag,五月底插上小旗,结果拖到六月底七月初才来执行.说什么工作忙都是借口,就是睡的比猪早,起的比猪晚. 本来实现多选单选这个功能,vue组件中在表单方面提供了一个v-model指令,非常 ...