钢条切割-递归,记忆性递归,dp

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了钢条切割-递归,记忆性递归,dp相关的知识,希望对你有一定的参考价值。

钢条切割


方法1:递归

import java.util.Scanner;

public class Cutting {
    public static int n = 10 ;
    public static int [] p = {1,5,8,16,10,17,17,20,24,30} ;
    public static int cut(int x){
        int res = 0 ;
        if(x == 0){
            return 0 ;
        }
        for(int i=1; i<=x; i++){
            int temp = p[i-1] + cut(x-i) ; //每一段的价格+剩余的最佳方案的价格
            res = Math.max(temp, res) ; //找出所有temp的最大值,即是切割后的最大价值
        }
        return res ;
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in) ;
        int x = input.nextInt() ;
        System.out.println(cut(x)) ;
    }
}

方法2:记忆性递归–提高效率

import java.util.Arrays;
import java.util.Scanner;

public class Cutting {
    public static int n = 10 ;
    public static int [] p = {1,5,8,16,10,17,17,20,24,30} ;
    static int [] remember = new int [n] ;
    public static int cut(int x){
        int res = 0 ;
        if(x == 0){
            return 0 ;
        }

        for(int i=1; i<=x; i++){
            if(remember[x-i] == -1){
                remember[x-i] = cut(x-i) ; //提前找到,存储,不用每次都寻找
            }
            int temp = p[i-1] + remember[x-i] ; //每一段的价格+剩余的最佳方案的价格
            res = Math.max(temp, res) ; //找出所有temp的最大值,即是切割后的最大价值
        }
        return res ;
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in) ;
        Arrays.fill(remember,-1) ;
        int x = input.nextInt() ;
        System.out.println(cut(x)) ;
    }
}

方法3:动态规划


import java.util.Arrays;
import java.util.Scanner;

public class Cutting {
    public static int n = 10 ;
    public static int [] p = {1,5,8,16,10,17,17,20,24,30} ;
    static int [] vs = new int [n+1] ;
    public static int dp(int x){
        for(int i=1; i<=x; i++){ //拥有钢条的长度
            for(int j=1; j<=i; j++){ //所有可能组合成i的数字范围为1~i
                int temp = vs[i-j] + p[j-1] ; //p[j-1]为长度为j的价值,vs[i-j]为其余长度的最大价值
                vs[i] = Math.max(vs[i], temp) ; //长度为i的钢条如果出现更大价值,就更新
            }
        }
        return vs[x];
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in) ;
        Arrays.fill(vs, 0) ;
        int x = input.nextInt() ;
        System.out.println(dp(x)) ;
    }
}

以上是关于钢条切割-递归,记忆性递归,dp的主要内容,如果未能解决你的问题,请参考以下文章

动态规划钢条切割问题

动态规划 - 钢条切割

动态规划问题以及诸多实例分析

记忆化递归与树形DP

Leetcode 873 最长斐波那契子序列 记忆化递归与剪枝DP

钢条切割