【每日打卡】Day15:最佳加法表达式(大数运算)JAVA实现(部分超时)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40184885/article/details/89684443

 

描述

给定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 都装不下的大整数,并用模拟列竖式的办法进行大整数的加法。

解析

 基本思路是取排列,选择放置加号的位置,然后进行运算,这样计算可以通过一部分测试点,但是超时,等待后续优化!

import java.util.*;
import java.math.BigInteger;
public class Main {
    static int n,m;
    static int ans[] = new int[55];
    static int vis[] = new int[55];
    static int cc = 0;
    static String mm = "100000000000000000000000000000000000000000000000000";
    static BigInteger mv[] = new BigInteger[15];

    static BigInteger mi(int p){
        BigInteger res = new BigInteger("1");
        for(int i = 0; i < p; i ++)
            res = res.multiply(new BigInteger("10"));
        return res;
    }

    static BigInteger re(int a[], int p, int q){
        BigInteger ans = new BigInteger("0");
        int s = q - p;
        for(int i = 0; i <= s; i ++)
            ans = ans.add(mi(s-i).multiply(new BigInteger(String.valueOf(a[p++]))));
        return ans;
    }

    static void dfs(int ix, int[] a, int n, int m, BigInteger mval[]){
        if(m >= n){
            mval[cc] = new BigInteger("0");
            return;
        }
        if(ix == m){
            if(ans[1] == 1 || ans[m] == n)
                return ;
            BigInteger sum = re(a,0,ans[1]-2);
            for(int i = 1; i < m; i ++)
                sum = sum.add(re(a,ans[i]-1,ans[i+1]-2));
            sum = sum.add(re(a,ans[m]-1,n-2));
            if(sum.compareTo(mval[cc]) < 0)
                mval[cc] = sum;
            return;
        }
        for(int i =ans[ix]+1; i < n+1; i ++){
            if(vis[i] == 0){
                vis[i] = 1;
                ans[ix+1] = i;
                dfs(ix+1,a,n,m,mval);
                vis[i] = 0;
            }
        }
    }

    public static void main(String []args){
        Scanner sc = new Scanner(System.in);

        for(int i = 0; i < 15; i ++)
            mv[i] = new BigInteger(mm);
        while(cc < 15){

            m = sc.nextInt();
            String str = sc.next();
            n = str.length();
            int a[] = new int[n];
            for(int i = 0; i < n; i ++)
                a[i] = str.charAt(i) - '0';
            dfs(0,a,n+1,m,mv);
            System.out.println(mv[cc].toString());
            cc++;
        }
        sc.close();
    }

}

 

展开阅读全文

没有更多推荐了,返回首页