作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序,给出给定两个数字的可能组合的数量,例如 N 选择 K。我有一个递归解决方案,如下所示:
public static int combinations(int group, int members) {
if (members == 1) {
return group;
}
else if (members == group) {
return 1;
}
else {
return(combinations(group - 1, members - 1) +
combinations(group - 1, members));
}
}
这个可行,但我需要使用内存来提高时间复杂度并加快更大数字的速度,但我不知道如何去做。我该如何去做呢?
最佳答案
根据公式n 选择 k = ( n - 1 选择 k - 1) + ( n-1 选择 k )
自下而上的动态规划方法是:
dp[n][k] = dp[n-1][k-1] + dp[n-1][k] if n > k
else if n == k
dp[n][k] = 1
else
dp[n][k] = 0
从n = 1
和k = 1
开始
dp[1][1] = 1; dp[1][0] = 1;
然后填充一个二维数组,直到dp[n][k]
就像您的情况一样,也可以通过内存来完成。您的方法可以更改为:
int[][] dp = new int[group][members];
public static int combinations(int group, int members, int[][] dp ) {
if (members == 1) {
return group;
} else if (members == group) {
return 1;
}
if ( dp[group][members] != 0 ) {
return dp[group][members];
}
int first = 0, second = 0;
if ( members <= group - 1) {
first = combinations( group - 1, members - 1, dp );
second = combinations( group - 1, members );
} else if ( members - 1 <= group - 1 ) {
first = combinations( group - 1, members - 1, dp );
}
dp[group][members] = first + second;
return dp[group][members];
}
关于使用记忆化/动态编程的 Java 组合学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53182377/
为什么 Silverlight 中有这么多内存? 数据: 我有时在用户界面上有很多复选框和其他复选框。当然,我正在从视觉对象中删除复选框和其他控件,但 Silverlight 的内存使用量总是增加;它
我调用一个返回给定特定链式方法的数组的对象: Songs::duration('>', 2)->artist('Unknown')->genre('Metal')->stars(5)->getAllA
为了解释标题.. Selenium RC keeps insisting that A system shutdown has already been scheduled 并因此拒绝进行自动化测试。
我是一名优秀的程序员,十分优秀!