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

Posted knmxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百练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大数。。

 1 import java.math.BigDecimal;
 2 import java.math.BigInteger;
 3 import java.util.Scanner;
 4 
 5 public class Main {
 6     static BigInteger INF = new BigInteger("9999999999999999999999999999999999999999999999999999999");
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         Scanner sc = new Scanner(System.in);
10         BigInteger dp[][] = new BigInteger[55][55];
11         int m,n;
12         BigInteger s;
13         
14         while(sc.hasNext())
15         {
16             m = sc.nextInt();
17             s = sc.nextBigInteger();
18             
19             n = s.toString().length();
20             
21             //BigDecimal num[][] = new BigDecimal[n+1][n+1];//num[i][j]表示从s第i个数到第j个数组成的数字
22             /*
23             for(int i = 1;i<=n;++i)
24                 for(int j = 0;j<=n;++j)
25                 {
26                     if(i<=j)
27                     {
28                         num[i][j] = new BigDecimal(s.toString().substring(i-1,j));
29                     }
30                 }
31                 */
32             
33             dp[0][0] = new BigInteger("0");//没有数字没有加号的最小值是0
34             for(int i = 1;i<=n;++i)
35             {
36                 dp[i][0] =  new BigInteger(s.toString().substring(0,i));//没有加号的情况下,最小值就是数字自己
37             }
38             
39             for(int i = 0;i<=n;++i)
40                 for(int j = 1;j<=m;++j)
41                 {
42                     
43                     dp[i][j] = INF;
44                     if(i>=j+1)//j个加号能插入i个数字中
45                     {
46                         for(int k = j;k<i;++k)
47                         {
48                             dp[i][j] = dp[i][j].min(dp[k][j-1].add(new BigInteger(s.toString().substring(k,i))));
49                         }
50                     }
51                 }
52                 
53             System.out.println(dp[n][m]);    
54         }//while
55     }
56 
57 }

 



以上是关于百练4152:最佳加法表达式(dp+高精度)的主要内容,如果未能解决你的问题,请参考以下文章

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

最佳加法表达式

刷题总结——regular words(hdu1502 dp+高精度加法+压位)

百练1088 DP+DFS

ACM/ICPC 之 递归(POJ2663-完全覆盖+POJ1057(百练2775)-旧式文件结构图)

源哥每日一题第十三弹 百练4124:海贼王之伟大航路 状压dp