A:题目描述:

  数字拆分:

   一个数字有两种拆法,1 对所有数字减一 2 把所有数字都拆分成两个更小的数之和,问之多拆分n次,把N完全消去需要多少轮操作。

输入取值范围: 1<= N <=100,  0<=K<=100

样例: 输入 5 2 ,输出 4。 输入15 4,输出 6

定义dp[i][j]为将i之多拆分j次所有的轮数,dp[i][j] = min(dp[i-1][j-1], dp[(i+1)/2][j-1]) + 1 , dp[i-1][j] 代表这次不拆分,减去1, dp[(i+1)/2][j-1] 代表这次进行拆分,拆分成两个中位数,那么较大的数的所需操作肯定大于较小的中位数的所需的操作。

public class MaIn {
    public static  void main(String[] args){
        Scanner in = new Scanner(System.in);
        String[] input = in.nextLine().split(" ");
        int n, m;
        n = Integer.parseInt(input[0]);
        m = Integer.parseInt(input[1]);
//        dp[1][0~100]=1;
        if(m==0){
            System.out.print(n);
            return;
        }
        int[][] dp = new int[105][105];
        for(int i=0;i<=100;i++){
            dp[i][0] = i;
        }
        for(int i=0;i<=100;i++){
            dp[1][i] = 1;
        }
        for(int i=1;i<=n;i++){
           for(int j=1;j<=m;j++){
                 dp[i][j]=Math.min(dp[i-1][j],dp[(i+1)/2][j-1])+1;
           }
        }
        System.out.print(dp[n][m]);
    }
}
View Code

相关文章: