常见数据结构与算法:拆分数字(暴力递归,动态规划)
·
public class SplitNumber {
public static void main(String[] args) {
int pre = 1;
int rest = 27;
System.out.println(process(1,rest));
System.out.println(dp(1,rest));
}
// pre 上一个拆出来的数
// rest 剩下拆的数
public static int process(int pre, int rest){
if(rest == 0){
return 1;
}
if(pre > rest){
return 0;
}
int way = 0;
for (int i = pre; i <= rest; i++) {
way += process(i, rest-i);
}
return way;
}
public static int dp(int pre, int rest){
int N = rest + 1;
int[][] dp = new int[N][N];
// 行表示rest 列表示pre
for (int i = 1; i < dp.length; i++) {
dp[0][i] = 1;
}
for (int i = 1; i < dp.length; i++) { // i:rest
for (int j = 1; j <= i; j++) {// j:pre
for (int k = j; k <=i; k++) {
dp[i][j] += dp[i-k][k];
}
}
}
return dp[N-1][1];
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)