java Count总和可被k整除的子序列总数
我正试图为这个问题写一个DP解决方案:计算一个数组中可能的子序列的总数,这个数组的元素和可以被k整除
我已经编写了以下解决方案。但它并没有给出正确的结果。与下面的代码片段类似,数组是{1,2,1},k=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);
}
# 1 楼答案
面临同样的问题。但最终得到了答案
返回的答案总是比所有可能的子序列多1个。这是因为我们知道0总是一个有效的答案。因此,如果假设您没有从数组中选取任何单个元素,那么sum=0。因此,它认为这是一个有效的答案,并将我们的答案增加1。因此,要得到实际答案,只需将返回值减1
# 2 楼答案
@piotrekg2解决方案的Python代码。 看起来不错
# 3 楼答案
# 4 楼答案
设
s
表示长度序列N
,且K
是给定的除数dp[i][j]
=余数等于j
的s[0..i]
子序列数。我们将计算所有0 <= i < N
和0 <= j < K
的dp
结果是
dp[N - 1][0]