Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 填充给定形状的选项数_Java_Algorithm_Recursion - Fatal编程技术网

Java 填充给定形状的选项数

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)

给定两个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)+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));
   }

   }