zoukankan      html  css  js  c++  java
  • AOJ-190 乘积最大问题

    题目大意:

    设有一个长度为N的数字串,要求使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1部分的乘积能够为最大。其中n <= 100, k < n

    解题思路:

    动态规划

    dp[i][j]表示当i个乘号在第j位的时候,前面的最大值。

    这样状态转移方程就得到为:

    dp[i][j] = max(dp[i][j], dp[i-1][k] * subString(s, k, j)); 其中k为[i-1, j-1]中的整数。

    最后遍历dp[k][i]得到最后的结果。

    代码:

    因为这道题目需要使用大整数,用Java可以明显减少工作量。(题目数据比较水我觉得

    import java.util.Scanner;
    import java.math.BigInteger;
    import java.io.BufferedInputStream;
    
    public class Main {
    	private static Scanner in;
    	private static BigInteger Max(BigInteger a, BigInteger b){
    		if(a.compareTo(b) < 0) return b;
    		else return a;
    	}
    	public static void main(String[] args){
    		in = new Scanner(new BufferedInputStream(System.in));
    		while(in.hasNext()){
    			int n = in.nextInt();
    			int k = in.nextInt();
    			String s = in.next();
    			BigInteger[][] dp = new BigInteger[k+1][n+1];
    			
    			for(int i = 0; i < k + 1; ++i)
    				for(int j = 0; j < n + 1; ++j)
    					dp[i][j] = BigInteger.ONE;
    			for(int i = 1; i <= k; ++i){
    				for(int j = 1; j < n; ++j){
    					for(int a = i - 1; a <= j - 1; ++a){
    						dp[i][j] = Max(dp[i][j], dp[i-1][a].multiply(new BigInteger(s.substring(a, j))));
    					}
    				}
    			}
    			
    			BigInteger ans = BigInteger.ZERO;
    			for(int i = k; i < n; ++i){
    				ans = Max(ans, dp[k][i].multiply(new BigInteger(s.substring(i, n))));
    			}
    			System.out.print(ans);
    		}
    	}
    }


  • 相关阅读:
    浅析值类型与引用类型的内存分配[转载]
    C#引用类型参数,ref按引用传值
    java调用WebService的例子
    poj 2727 Expectation
    IT O
    Android_notepadz
    tomcat mysql 数据源
    android_snakez
    Tomcat下配置ssl
    Android_Hello Worldz
  • 原文地址:https://www.cnblogs.com/wiklvrain/p/8179386.html
Copyright © 2011-2022 走看看