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的更多相关文章

  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. Servlet入门总结及第一个Servlet程序

    目录 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 ...

  2. 如何下载腾讯视频的视频转为MP4常用格式视频

    想起之前看过中央一台的<我要上春晚>中有个节目叫<迎春花>,两个女孩表现特别好,想下载这个视频,然后发现CCTV提供的客户端不好用,腾讯视频有,但是腾讯视频下载下来是qlv格式 ...

  3. javascript 以“年-月-日 时:分:秒”格式显示当前时间

    运行代码 /** * Created by shgbit on 2015/1/9. *js代码 */ function showNow(){ var t=new Date();    var mont ...

  4. git push 问题汇总

    Q:git push时卡死 这个问题找的快要放弃的时候... A: git config --global http.postBuffer [via] Q:git push 报错 Counting o ...

  5. centos7修改root密码

    1.重启系统,在下面界面时按e键 2.出现可编辑新内容,按向下键向下滑动,找到ro,并修改为rw 后,在LANG=en_US.UTF-8后面再加init=/bin/sh,结果如下图 3.然后按下ctr ...

  6. Splash plugins_enabled 属性

    plugins_enabled属性可以控制浏览器插件(如 Flash 插件)是否开启.默认情况下,此属性是 false ,表示不开启. function main(splash, args) spla ...

  7. 使用 requests 访问 HTTPS

    当我们访问 HTTPS 的网站时,需要进行证书验证,在浏览器中可以自动处理验证问题,在 Python 中有以下两种做法: import requests //不进行证书验证,但这种方式会出现警告,如下 ...

  8. 《Lua程序设计》9.1 协同程序基础 学习笔记

    协同程序(coroutine)与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区 ...

  9. JDBC批量加密数据库密码

    package com.lxc.wmb; import java.io.UnsupportedEncodingException; import java.security.MessageDigest ...

  10. 适配器模式(PHP实现)

    [目的]:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作 [主要角色]目标(Target)角色:定义客户端使用的与特定领域相关的 ...