动态编程查找产品的最大值和数组中元素的总和

时间:2014-12-11 06:23:28

标签: algorithm dynamic-programming

您好我有以下问题需要实施:

给定整数数组:1 2 7 5 1 2 我想找到最大相邻乘积和,即1+2+(5*7)+1+2 = 41

给出整数数组:1 2 4 2 4 2 我想找到最大相邻乘积和,即1+(2*4)+(2*4)+2 = 19

乘法的约束是只有一个相邻元素可用于乘法。 即如果我们在数组中有2 4 2,我们会将其计算为2+(4*2) or (2*4)+2

我是动态编程的初学者。 我无法弄清楚以下问题的递归关系。

任何人都可以提出建议吗?

2 个答案:

答案 0 :(得分:4)

逐步解决方案是这样的:

  • 考虑第一个元素,当没有其他元素时它是最大的。
  • 虽然你的所有元素都没有继续。
  • 添加第i个元素:
    • F(i)= Max {F(i-1)+ e i ,f(i-2)+ e i-1 * e

其中F(i)是前i个元素的最大值,e i 是你的第i个元素。

考虑一下:1 2 4 3 4

  • 首先我们有F(1) = 1
  • 然后F(2) = 1 + 2
  • 然后我们比较F(2) + 4 = 1 + 2 + 4F(1) + 2 * 4= 1 + 2 * 4,因此它是F(3) = 1+2*4 = 9
  • 然后您有F(2) + 4 * 3 = 1 + 2 + 4 * 3F(3) + 3 = 1 + 2 * 4 + 3所以它是F(4) = 1 + 2+ 4*3 = 15
  • 然后您有F(4) + 4 = 1 + 2 + 4 * 3 + 4F(3) + 3*4 = 1 + 2 * 4 + 3 * 4所以它是F(5) = 1 + 2 * 4 + 3 * 4 = 21

答案 1 :(得分:1)

我发布了针对此问题的完整java解决方案。为已实现的逻辑添加了内联注释。

public class MaxValueOfRagularExpression {

    public static void main(String[] args) {
        int size=6;
        int arr[] = new int[size];

        arr[0]=2;
        arr[1]=1;
        arr[2]=1;
        arr[3]=1;
        arr[4]=1;
        arr[5]=2;

        // array elements are as follows :
        // A0     A1    A2      A3    A4     A5
        // 2      1      1      1     1      2

        int sol[] = new int[size];
        sol[0]=arr[0];
        for(int i = 1;i<size;i++){
            // sol[i] would contain the optimized value so far calculated.
            for(int k = 0;k<i ;k++) {
                // for each k , find sum of all array elements  i.e. k+1<=j<=i
                // and then calculate max of (sol[k] + sum or sum[k] * k )
                int sum =0;
                for (int j = k+1; j <= i; j++) {
                    sum += arr[j];
                }
                sol[i] = Math.max(Math.max(sol[i],(sol[k] + sum)), sol[k]*sum);
            }
        }
        // after processing above block , the sol array will look like :
        //SOL[0]  SOL[2]   SOL[2]   SOL[3]   SOL[4]   SOL[5]
        // 2        3       4        6          9     18
        System.out.println(sol[size-1]);
    }
}