Java 填充给定形状的选项数
给定两个1d数组,其中一个数组的长度为n,另一个数组的长度为m,编写一个递归算法,以找到该形状可由1x1、1x2或2x1块填充的方式数, 这是我的尝试,但我相信我数过几次相同的选项:Java 填充给定形状的选项数,java,algorithm,recursion,Java,Algorithm,Recursion,给定两个1d数组,其中一个数组的长度为n,另一个数组的长度为m,编写一个递归算法,以找到该形状可由1x1、1x2或2x1块填充的方式数, 这是我的尝试,但我相信我数过几次相同的选项: public static int foo(int n1 ,int m){ if(n1==0 && m ==0){ return 1; } if(n1 < 0 || m < 0) return 0; return (foo(n1-1,m)+foo(n1,m-1)
public static int foo(int n1 ,int m){
if(n1==0 && m ==0){
return 1;
}
if(n1 < 0 || m < 0)
return 0;
return (foo(n1-1,m)+foo(n1,m-1)+foo(n1-1,m-1) +foo(n1,m-2) + foo(n1-2,m));
}
publicstaticintfoo(intn1,intm){
如果(n1==0&&m==0){
返回1;
}
如果(n1<0 | | m<0)
返回0;
返回(foo(n1-1,m)+foo(n1,m-1)+foo(n1-1,m-1)+foo(n1,m-2)+foo(n1-2,m));
}
***更新****
现在代码可以编译了
示例:
输入foo(2,2)输出:21,正确答案是7。
输入foo(4,3)输出:417,正确答案是32
这些是foo(2,2)的选项
我们假设
n
。如果不是这种情况,我们可以反转参数-这使代码更简单
一旦我们处理了终止条件,我们使用减少和征服策略根据以下规则减少输入:如果n==m
,我们可以两种方式减少n&m
,一种方式减少2,n&m
一种方式减少1,n
一种方式减少2,和n
按2和m
按1单向移动。如果n
我们可以将m
单向减少1,将m
单向减少2
static int foo(int n, int m)
{
if(n > m) return foo(m, n);
if(n < 0 || m < 0) return 0;
if(n == 0 && m == 0) return 1;
if(n == m) return 2*foo(n-1, m-1) + foo(n-2, m-2) + foo(n-1, m-2) + foo(n-2, m-1);
return foo(n, m-1) + foo(n, m-2);
}
对于n==m
(2,7,22,71,…)的情况,这是一个已知的整数序列()
以下是(3,4)的32种配置,仅供参考:
我相信我已经找到了问题的正确答案: 但在有比我更了解的人确认我的答案之前,我不会解决这个问题
public static int foo(int n1 ,int m){
if(n1==0 && m ==0){
return 1;
}
if(n1 < 0 || m < 0)
return 0;
if(m == n1){
return Integer.max(foo(n1-1,m),foo(n1,m-1)) + Integer.max(foo(n1-2,m),foo(n1,m-2))+ foo(n1-1,m-1);
}else{
return Integer.max(foo(n1-1,m),foo(n1,m-1)) + Integer.max(foo(n1-2,m),foo(n1,m-2));
}
}
publicstaticintfoo(intn1,intm){
如果(n1==0&&m==0){
返回1;
}
如果(n1<0 | | m<0)
返回0;
如果(m==n1){
返回Integer.max(foo(n1-1,m),foo(n1,m-1))+Integer.max(foo(n1-2,m),foo(n1,m-2))+foo(n1-1,m-1);
}否则{
返回Integer.max(foo(n1-1,m),foo(n1,m-1))+Integer.max(foo(n1-2,m),foo(n1,m-2));
}
}
现在我只取最大子问题的答案,所以我不会重复计算同一个选项 不,你的讲师是对的-讲师总是对的:)我已经更新了答案。
(0, 0) = 1
(0, 1) = 1
(0, 2) = 2
(0, 3) = 3
(0, 4) = 5
(1, 1) = 2
(1, 2) = 3
(1, 3) = 5
(1, 4) = 8
(2, 2) = 7
(2, 3) = 10
(2, 4) = 17
(3, 3) = 22
(3, 4) = 32
(4, 4) = 71
public static int foo(int n1 ,int m){
if(n1==0 && m ==0){
return 1;
}
if(n1 < 0 || m < 0)
return 0;
if(m == n1){
return Integer.max(foo(n1-1,m),foo(n1,m-1)) + Integer.max(foo(n1-2,m),foo(n1,m-2))+ foo(n1-1,m-1);
}else{
return Integer.max(foo(n1-1,m),foo(n1,m-1)) + Integer.max(foo(n1-2,m),foo(n1,m-2));
}
}