Java 在动态规划中初始化int maxValue=Integer.MIN_值有什么好处?

Java 在动态规划中初始化int maxValue=Integer.MIN_值有什么好处?,java,algorithm,dynamic-programming,Java,Algorithm,Dynamic Programming,要准确地问您这个问题,初始化int max_val=Integer.MIN_值比int max_val=price[i-1]有什么好处 这似乎是一个微不足道的DP问题。但是,我需要你的帮助。一般DP问题从初始化max_val为Integer.MIN_值开始。我知道这是一种标准的方式 但是,我发现将max_val设置为price[I-1]并没有错 e、 我用arr={1 5 8 9 10 17 20}和cutRod(arr,8)得到了22分 我用arr={3 5 8 9 10 17 20}和cut

要准确地问您这个问题,初始化int max_val=Integer.MIN_值比int max_val=price[i-1]有什么好处

这似乎是一个微不足道的DP问题。但是,我需要你的帮助。一般DP问题从初始化max_val为Integer.MIN_值开始。我知道这是一种标准的方式

但是,我发现将max_val设置为price[I-1]并没有错

e、 我用arr={1 5 8 9 10 17 20}和cutRod(arr,8)得到了22分

我用arr={3 5 8 9 10 17 20}和cutRod(arr,8)得到了24分

公共类{
公共静态void main(字符串[]args){
int[]arr=新的int[]{2,5,13,19,20};
int size=arr.length;
int结果=切割杆(arr,尺寸);
System.out.println(“可获得的最大值为”+结果);
}
私有静态int-cutRod(int[]价格,int n){
int val[]=新的int[n+1];
val[0]=0;

对于一般意义上的(int i=1;i),将局部变量初始化为
Integer.MIN_值
…与保证小于或等于所计算的最大值的任何其他值相比,没有明显的“优势”

在这种情况下,这种调整显然对计算复杂度没有影响。您仍然需要执行内环
j-i
次。它可能会影响
Math.max
调用内部的分支,但我怀疑性能差异是否会很大……无论哪种方式,唯一可以确保的方法都是小心的用一大组有代表性的输入进行基准测试。这只会给你这个特定问题的答案

但是,您知道
Integer.MIN_值必须小于或等于实际的最大值。因此,使用该值意味着需要在正确性证明中证明的事情少了一件。(或者换一种方式说,它可能使您的代码更容易理解。)


但事情是这样的。如果你要尝试这样的调整,你应该自己进行推理……而不是寻找经验上的“优势”,或者让其他人为你进行推理。如果你这样做是出于性能原因,你也应该进行基准测试


如果需要做的工作太多……请接受Knuth关于过早优化的建议。

假设数组已排序,不是吗?@JoakimDanielson嗯,正如我所见,它已排序。但是,数组不需要排序。我不知道你问题的重点是什么。与未排序的数组不同吗?谢谢,伙计!“因此,使用该值意味着需要在正确性证明中证明的事情少了一件。”这很有意义:)
public class RodCutting {
    public static void main(String[] args) {
        int[] arr = new int[] {2, 5, 13, 19, 20};
        int size = arr.length;
        int result = cutRod(arr, size);
        System.out.println("Maximum Obtainable Value is " + result);
    }

    private static int cutRod(int[] price, int n) {
        int val[] = new int[n+1];
        val[0] = 0;

        for (int i = 1; i <= n; i++) {
            int max_val = price[i-1]; // previously, int max_val = Integer.MIN_VALUE;
            for (int j = 0; j < i; j++) 
                max_val = Math.max(max_val,  val[j+1]+ val[i - j - 1]); 
                // previously, max_val = Math.max(max_val, price[j] + val[i - j - 1]);

            val[i] = max_val;
        }
        return val[n];
    }
}