DP Algo - 通过添加除

时间:2017-08-13 22:47:05

标签: algorithm dynamic-programming

正在做一个HackerRank问题:

https://www.hackerrank.com/challenges/equal/problem

如果问题基本上是给定一个数组,那么通过添加除数组中除一个元素之外的所有元素,找到使数组相等所需的最小加法数。要添加的可能值为1,2,5。

因此,如果我们有一个[2,2,3,7]数组,我们可以这样做:

Choose i = 3 as the excluded element and add all other by 5:
[7,7,8,7]
Choose i = 2 as the excluded and add by 1:
[8,8,8,8] 
This gives minimum of 2 additions.

到目前为止,我在算法方面的目标是:

我有一个Entry对象:

public class entry {
int[] arr;
int count;

public entry(int[] arr, int count) {
    this.arr = arr;
    this.count = count;
    }
}

因为我们需要传入一个新的数组添加数(计数)

我对算法的高级规范是:

Entry object e with the given arr and count = 0

int[] poss = {1,2,5};    

static int minOps(entry e, LinkedList<entry> dpMem) {
    int min = Integer.MAX_VALUE;

    if (equal(e.arr)) {
        return e.count;
    }

    int dpCount = checkdpMem(dpMem, e.arr); //checking if already solved

    if (dpCount != -1) { //if solved
        return dpCount;
    } else {
        for (int i = 0; i < poss.length; i++) {
            for (int chosenIndex = 0; chosenIndex < e.arr.length; chosenIndex++) {
                int temp = minOps(increment(e, chosenIndex, poss[i]), dpMem);
                if (temp < min) {
                    min = temp;
                }
            }
        }
    }
    return min;
}

正在发生的事情是它陷入无限循环,因为它会连续增加除了第一个1之外的所有其他元素。我需要做的是改变所选择的排除指数,但我不确定如何以“正确”的方式这样做。这是因为有时候你想要以相同的“方式”多次继续增加(即:除了arr [0]之外的所有内容增加x次,直到它们相等为止)。

思考?提前谢谢!

0 个答案:

没有答案