计算总和可以被k整除的子序列

时间:2015-09-25 07:46:05

标签: java arrays algorithm dynamic-programming

我正在尝试为该问题编写DP解决方案:计算一个数组的子序列总数,其元素的总和可以被k整除。

我写了以下解决方案。但它没有给出正确的结果。与下面的代码片段一样,数组为{1,2,1},k = 3.因此,预期3可被3整除的子序列总数为2,但实际结果为3,这显然是不正确的。

请指出我的错误。

private int countDP(int[] a, int k)
{
    int L = a.length;

    int[][] DP = new int[L][k];

    for(int i = 0; i < DP.length; i++)
    {
        for(int j = 0; j < DP[0].length; j++)
            DP[i][j] = -1;
    }

    int res = _countDP(a, k, DP, 0, 0);

    return res;
}

private int _countDP(int[] a, int k, int[][] DP, int idx, int m) //Not giving the correct result.
{
    if(idx == a.length)
        return m == 0 ? 1 : 0;

    if(DP[idx][m] != -1)
        return DP[idx][m];

    int ans = 0;

    ans = _countDP(a, k, DP, idx + 1, m);
    ans += _countDP(a, k, DP, idx + 1, (m + a[idx]) % k);

    return DP[idx][m] = ans;
}

public static void main(String[] args)
{
    CountSubnsequences cs = new CountSubnsequences();

    int[] a = {1, 2, 1};
    int k = 3;

    int total1 = cs.countDP(a, k);

    System.out.println("Total numeber of sub sequences: " + total1);
}

2 个答案:

答案 0 :(得分:3)

private void changeTextView(TextView tv, String target) { String bString = (String) tv.getText(); int startSpan = 0, endSpan = 0; Spannable spanRange = new SpannableString(bString); while(true) { startSpan = bString.indexOf(target, endSpan); if(startSpan < 0) break; endSpan = startSpan + target.length(); spanRange.setSpan( new StyleSpan(android.graphics.Typeface.BOLD), startSpan, endSpan, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } tv.setText(spanRange); } 表示长度为s的输入序列,N为给定的除数。

K =序列dp[i][j]的子序列数,余数等于s[0..i]。我们将为所有jdp计算0 <= i < N

0 <= j < K

结果为dp[i][j] = 0 for all (i, j) dp[0][0] += 1 dp[0][s[0] mod K] += 1 for i = 1 .. N - 1 for j = 0 .. K - 1 dp[i][j] = dp[i - 1][j] for j = 0 .. K - 1 dp[i][(j + s[i]) mod K] += dp[i - 1][j]

答案 1 :(得分:0)

int fun(int i,int s)
{

    if(i==1){

        if(s-a[i]!=0 && (s-a[i])%k==0)
        return 1;
        else
            return 0;}
    else{
        if((s-a[i])%k==0){
            return 1+fun(i-1,s-a[i])+fun(i-1,s);
        }
        else{
            return fun(i-1,s-a[i])+fun(i-1,s);
        }
    }
}