OpenJ_Bailian - 4152 最佳加法表达式 dp
http://bailian.openjudge.cn/practice/4152?lang=en_US
题解 :dp[i][j]代表前i个字符加j个加号可以得到的最小值,于是dp[i+k[j+1]可以由dp[i][j]得到。具体转移方程看代码。
然后数字是50位所以要用高精度类。自己写了一个
坑:高精度的<和+有bug。一开始的更新方法也在乱写
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h>
- #include<stdlib.h>
- #include<iostream>
- #include<string>
- #include<vector>
- #include<algorithm>
- #include<string.h>
- using namespace std;
- const int N = + ;
- typedef long long ll;
- struct BigInterger {
- static const int BASE = 1e8;
- static const int WIDTH = ;
- vector<int> s;
- BigInterger(long long num = ) { *this = num; }
- BigInterger operator =(long long num) {
- s.clear();
- do {
- s.push_back(num%BASE);
- num /= BASE;
- } while (num > );//num==0
- return *this;
- }
- BigInterger operator =(const string& str) {
- s.clear();
- int x, len = (str.length() - ) / WIDTH + ;//len==width
- for (int i = ; i < len; i++) {
- int end = str.length() - i*WIDTH;
- int start = max(, end - WIDTH);
- sscanf(str.substr(start, end - start).c_str(), "%d", &x);
- s.push_back(x);
- }
- return *this;
- }
- BigInterger operator +(const BigInterger& b)const {
- BigInterger c;
- c.s.clear();
- for (int i = , g = ;; i++) {
- if (g == && i >= max(s.size(), b.s.size()))break;
- int x = g;
- if (i < s.size())x += s[i];
- if (i < b.s.size()) x += b.s[i];
- c.s.push_back(x%BASE);
- g = x / BASE;
- }
- return c;
- }
- BigInterger operator +=(const BigInterger& b) {
- *this = *this + b; return *this;
- }
- bool operator<(const BigInterger& b)const {
- if (s.size() != b.s.size()) return s.size() < b.s.size();
- for (int i = s.size() - ; i >= ; i--) {
- if (s[i] != b.s[i]) return s[i] < b.s[i];//Width 个数字一起比
- }
- return false;//==
- }
- bool operator>(const BigInterger &b)const { return b < *this; }
- bool operator<=(const BigInterger &b)const { return !(b < *this); }
- bool operator>=(const BigInterger &b)const { return !(*this < b); }
- bool operator!=(const BigInterger &b)const { return b < *this || *this<b; }
- bool operator==(const BigInterger &b)const { return!(b < *this) && !(*this<b); }
- };
- ostream& operator <<(ostream &out, const BigInterger& x) {
- out << x.s.back();
- for (int i = x.s.size() - ; i >= ; i--) {
- char buf[];
- sprintf(buf, "%08d", x.s[i]);
- for (int j = ; j < strlen(buf); j++)cout << buf[j];
- }
- return out;
- }
- istream&operator>>(istream &in, BigInterger&x) {
- string s;
- if (!(in >> s))return in;
- x = s;
- return in;
- }
- BigInterger dp[N][N];//前i个数加j个加号的最小值。
- int main() {
- int n; BigInterger s; string s1;
- string INF;
- for (int i = ; i < ; i++)INF += "";
- while (cin >> n) {
- cin >> s1;
- int len = s1.length();
- s = s1;
- //if (n == 0) {cout << s<<endl; continue;}
- for (int i = ; i <= len; i++)
- for (int j = ; j <= n; j++) dp[i][j] = INF;
- for (int i = ; i <= len; i++)
- for (int j = ; j <= n; j++) {
- if (j == ) { dp[i][j] = s1.substr(, i); }
- else if (i < j + ) dp[i][j] = INF;
- else {
- for (int k = j; k <= i - ; k++) {
- BigInterger x;
- x = s1.substr(k, i - k);
- dp[i][j] = min(dp[i][j], dp[k][j - ] + x);
- }
- }
- //cout <<i<<j<<' '<< dp[i][j] << endl;
- }
- cout << dp[len][n] << endl;
- }
- }
OpenJ_Bailian - 4152 最佳加法表达式 dp的更多相关文章
- 百练4152:最佳加法表达式(dp+高精度)
描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36 输入有不超 ...
- OpenJudge 4152 最佳加法表达式
总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...
- 最佳加法表达式(dp)
题目描述: 有一个由1..9组成的数字串.问如果将m个加 号插入到这个数字串中,在各种可能形成的 表达式中,值最小的那个表达式的值是多少 (本题只能用于整数) 解题思路: 假定数字串长度是n,添完加号 ...
- 【OpenJ_Bailian - 4152 】最佳加法表达式(动态规划)
最佳加法表达式 Descriptions: 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆 ...
- dp 动规 最佳加法表达式
最佳加法表达式 有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少 解题思路 假定数字串长度是n,添完加号后,表达式的最后一个加号 ...
- 【动态规划】最佳加法表达式(百练oj4152)
总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...
- 递推,动态规划(DP),字符串处理,最佳加法表达式
看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ...
- java源码——0~9十个数字不重复地使用使加法表达式成立
这个问题是在我写个的几个博客里较为复杂的一个.首先,先看看整个问题的表述. 星号表示0~9的一个数字,而且不允许重复,使得下面的加法表达式成立.输出所有结果. ※ ※ ※ ※ ※ + 2 ...
- [JSOI2016] 最佳团队 (树形DP+01分数规划)
Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. 每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...
随机推荐
- C#中的Abstract、Virtual、Interface理解
容易混淆是必须的,都是与继承有关系,并且涉及到override的使用 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中 ...
- 导入贴图操作:处理贴图MaxSize和Format
using UnityEngine; using System.Collections; using UnityEditor; public class ImportModflyTextures : ...
- 自己搭建CDN服务器静态内容加速-LuManager CDN使用教程
为什么要自己来搭建一个CDN服务器实现网站访问加速?一是免费CDN服务稳定性和加速效果都不怎么行:二是用国内的付费CDN服务价格贵得要死,一般的草根站长无法承受:三是最现实的问题国内的CDN要求域名B ...
- [转]logging使用
来源:https://www.cnblogs.com/nancyzhu/p/8551506.html日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事 ...
- codeforces水题100道 第十三题 Codeforces Round #166 (Div. 2) A. Beautiful Year (brute force)
题目链接:http://www.codeforces.com/problemset/problem/271/A题意:给你一个四位数,求比这个数大的最小的满足四个位的数字不同的四位数.C++代码: #i ...
- iOS - 转场时 appear 与 disappear 的调用顺序探索
不同的转场方式 A.B viewDidDisappear调用的流程不同 在A页面跳转到B页面的过程中 A 的 viewDidDisappear 方法和 B 的 viewDidAppear 谁先调用? ...
- php安装xdebug后var_dump输出没有格式化的问题
开发环境,装了一个xdebug扩展方便调试代码. 但是环境配置好了之后却发现xdebug加载成功了但是var_dump输出的内容却没有使用html格式化 这时想到估计是php.ini里面的某个输出的配 ...
- Android设置横屏竖屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FUL ...
- 【大数据系列】在windows下连接linux 下的hadoop环境进行开发
一.下载Eclipse并安装 二.下载exlipse的hadoop plugin 三.打开Map Reduce视图 Window --> Perspective --> Open pers ...
- vue案例 - 使用vue实现自定义多选与单选的答题功能
4月底立得flag,五月底插上小旗,结果拖到六月底七月初才来执行.说什么工作忙都是借口,就是睡的比猪早,起的比猪晚. 本来实现多选单选这个功能,vue组件中在表单方面提供了一个v-model指令,非常 ...