百练4152:最佳加法表达式(dp+高精度)
描述
给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值。例如,在1234中摆放1个加号,最好的摆法就是12+34,和为36
输入有不超过15组数据
每组数据两行。第一行是整数m,表示有m个加号要放( 0<=m<=50)
第二行是若干个数字。数字总数n不超过50,且 m <= n-1输出对每组数据,输出最小加法表达式的值样例输入
2
123456
1
123456
4
12345
样例输出
102
579
15
提示要用到高精度计算,即用数组来存放long long 都装不下的大整数,并用模拟列竖式的办法进行大整数的加法。
搞了半天的C++高精度,,结果还是可耻地用了java大数。。
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner; public class Main {
static BigInteger INF = new BigInteger("9999999999999999999999999999999999999999999999999999999");
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
BigInteger dp[][] = new BigInteger[55][55];
int m,n;
BigInteger s; while(sc.hasNext())
{
m = sc.nextInt();
s = sc.nextBigInteger(); n = s.toString().length(); //BigDecimal num[][] = new BigDecimal[n+1][n+1];//num[i][j]表示从s第i个数到第j个数组成的数字
/*
for(int i = 1;i<=n;++i)
for(int j = 0;j<=n;++j)
{
if(i<=j)
{
num[i][j] = new BigDecimal(s.toString().substring(i-1,j));
}
}
*/ dp[0][0] = new BigInteger("0");//没有数字没有加号的最小值是0
for(int i = 1;i<=n;++i)
{
dp[i][0] = new BigInteger(s.toString().substring(0,i));//没有加号的情况下,最小值就是数字自己
} for(int i = 0;i<=n;++i)
for(int j = 1;j<=m;++j)
{ dp[i][j] = INF;
if(i>=j+1)//j个加号能插入i个数字中
{
for(int k = j;k<i;++k)
{
dp[i][j] = dp[i][j].min(dp[k][j-1].add(new BigInteger(s.toString().substring(k,i))));
}
}
} System.out.println(dp[n][m]);
}//while
} }
补一个师傅的C++做法,之后回来补
#include <iostream>
#include <algorithm>
using namespace std;
string Add(string &a, string &b) {
string sum;
int lena = a.length();
int lenb = b.length();
int i = ;
int j = ;
int carry = ;
int number = ;
while (i < lena || j < lenb) {
number = carry;
if (i < lena) number += (a[i++] - '');
if (j < lenb) number += (b[j++] - '');
sum += (number % + '');
carry = number / ;
}
if (carry == ) {
sum = sum + '';
} return sum;
} //1大于 0等于 -1小于
int comp(string &a, string &b) {
if (a.length() > b.length()) return ;
if (a.length() < b.length()) return -;
for (int i = a.length() - ; i >= ; --i) {
if (a[i] > b[i])
return ;
else if (a[i] < b[i]) {
return -;
}
}
return ;
} string maxSum(vector<vector<string>> &record, string& s, int start, int m) {
if (m == ) return s.substr(start); if (record[start][m] != "") {
return record[start][m];
} string &rec = record[start][m];
string minNumber = s;
for (int i = start; i < s.length() - m; ++i) {
string sub = s.substr(start, i - start + );
string remain = maxSum(record, s, i + , m - );
string r = Add(sub, remain);
if (comp(minNumber, r) == ) {
minNumber = r;
}
}
return rec = minNumber;
} int main()
{
int m;
string s;
while (cin >> m) {
cin >> s;
if (m == ) {
cout << s << endl;
continue;
}
reverse(s.begin(), s.end());
vector<vector<string>> record(s.length(), vector<string>(m + , ""));
string sum = maxSum(record, s, , m);
reverse(sum.begin(), sum.end());
cout << sum << endl;
}
return ;
}
百练4152:最佳加法表达式(dp+高精度)的更多相关文章
- OpenJ_Bailian - 4152 最佳加法表达式 dp
http://bailian.openjudge.cn/practice/4152?lang=en_US 题解 :dp[i][j]代表前i个字符加j个加号可以得到的最小值,于是dp[i+k[j+1]可 ...
- OpenJudge 4152 最佳加法表达式
总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...
- 最佳加法表达式(dp)
题目描述: 有一个由1..9组成的数字串.问如果将m个加 号插入到这个数字串中,在各种可能形成的 表达式中,值最小的那个表达式的值是多少 (本题只能用于整数) 解题思路: 假定数字串长度是n,添完加号 ...
- dp 动规 最佳加法表达式
最佳加法表达式 有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少 解题思路 假定数字串长度是n,添完加号后,表达式的最后一个加号 ...
- 【OpenJ_Bailian - 4152 】最佳加法表达式(动态规划)
最佳加法表达式 Descriptions: 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放1个加号,最好的摆 ...
- 【动态规划】最佳加法表达式(百练oj4152)
总时间限制: 1000ms 内存限制: 65536kB 描述 给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),使得所得到的加法表达式的值最小,并输出该值.例如,在1234中摆放 ...
- 递推,动态规划(DP),字符串处理,最佳加法表达式
看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ...
- ACM/ICPC 之 递归(POJ2663-完全覆盖+POJ1057(百练2775)-旧式文件结构图)
POJ2663-完全覆盖 题解见首注释 //简单递推-三个米诺牌(3*2)为一个单位打草稿得出规律 //题意-3*n块方格能被1*2的米诺牌以多少种情况完全覆盖 //Memory 132K Time: ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
随机推荐
- HTML5移动Web开发
1. 响应式web设计 说到这个,移动开发面对的屏幕尺寸那叫一个丰富,其中安卓阵营就够让人头痛的.我们在PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能正常显示的固定宽度居中 ...
- IBatis.NET 的配置
http://www.cnblogs.com/xiaogangqq123/archive/2011/06/29/2093250.html http://www.cnblogs.com/hjf1223/ ...
- map Codeforces Round #Pi (Div. 2) C. Geometric Progression
题目传送门 /* 题意:问选出3个数成等比数列有多少种选法 map:c1记录是第二个数或第三个数的选法,c2表示所有数字出现的次数.别人的代码很短,思维巧妙 */ /***************** ...
- 树形DP Gym 100496H House of Representatives
题目传送门 /* 题意:寻找一个根节点,求min f(u) = ∑ρ(v, u) * p(v).ρ(v, u)是u到v的距离,p(v)是v点的权值 树形DP:先从1出发遍历第一次,sum[u]计算u到 ...
- ACM_三角形的周长
三角形的周长 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n根棍子,棍子i的长度为ai,想要从中选出3根棍子组成周长尽可能长 ...
- Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!
Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!
- 面试中的一些小问题之html5和html4的区别?
HTML5建立的一些新规则: 新特性应该基于HTML.CSS.DOM.JavaScript: 减少对外部插件的需求,如flash将会用video标签和audio标签代替: 更加优秀的错误处理: 更多取 ...
- 语义分割:使用关系图辅助图像分割-Capsule Network、IceNet
文章:欲取代CNN的Capsule Network究竟是什么来头?它能为AI界带来革命性转折么? 文章:用于分类.检测和分割的移动网络 MobileNetV2 网络 文章:后RCNN时代的物体检测及分 ...
- Discuz伪静态代码
<?php /** * [伪静态跳转(xugui_redirect.{modulename})] (C)2012-2099 Powered by 懒人V难人. * Version: 1.0 * ...
- 梦想MxWeb3D协同设计平台 2019.02.28更新
梦想MxWeb3D协同设计平台 2019.02.28更新 SDK开发包下载地址: http://www.mxdraw.com/ndetail_10130.html 在线演示网址: http://www ...