Tere是一张大小为R×C的表格; R行和C列。
该表的子矩形被阻止。
我们只能向右或向下移动。在没有通过被阻挡的子矩形的情况下,从左上角单元到右下角单元的路径数是多少?
我的方法:
计算行r2 C = {0到c1-1}的路径和行r1的路径C = {c2 + 1,C}
r1,c1,r2和c2,阻塞矩形的左上角单元格和右下角单元格。
Cal Calculate C(n,k)
我的代码:
int R = in.nextInt()-1;
int C = in.nextInt()-1;
int r1 = in.nextInt()-1;
int c1= in.nextInt()-1;
int r2 = in.nextInt()-1;
int c2 = in.nextInt()-1;
long ans=0;
long temp=0;
temp+= Cal(R-r2+C-c1,C-c1);
for(int i=0;i<c1 && r2!=R;i++){
ans+=Cal(i+r2,r2)*(Cal(R-r2+C-i,C-i)-temp);
}
temp=0;
temp+=Cal(r1+c2,r1);
for(int i=c2+1;i<=C;i++){
ans+= (Cal(i+r1,r1)-temp)*Cal(C-i+R-r1,C-i);
}
System.out.println(ans);
我没有得到上述算法的正确答案。如果我做错了事,请帮帮我。
Sample input:
8 12
5 5 8 8 ANS:7008
答案 0 :(得分:1)
我建议采用动态编程方法来解决这个问题。每个&#34;解锁&#34;董事会中的单元格将有一个与之关联的数字,右下方的数量;目前这个数字在每个单元格中都是未定义的。
最好用一个例子解释一下。假设我们有
OOOOOO OXXOOO OXXOOO OOOOOO OOOOOO
作为我们的董事会,其中X
代表障碍,O
是一个正方形,我们还没有填充右下角的路径数。我们现在从右下角向后工作。我们首先填写右下角的数字1,尽管这可能没有多大意义。
OOOOOO OXXOOO OXXOOO OOOOOO OOOOO1
现在可以填写最靠近右下角的两个方格。它们很容易。
OOOOOO OXXOOO OXXOOO OOOOO1 OOOO11
现在我们可以填写3个方块:
OOOOOO OXXOOO OXXOO1 OOOO21 OOO111
在每种情况下,我们正在做的只是将正方形右边的数字和正方形下面的数字加在一起,我们可以想象零偏离板的右侧和底部。下一步:
OOOOOO OXXOO1 OXXO31 OOO321 OO1111
到目前为止,我们已经获得了二项式系数,这是我们在这样的问题中所期望的。下一步:
OOOOO1 OXXO41 OXX631 OO4321 O11111
更多二项式系数。下一步:
OOOO51 OXXA41 OXX631 O54321 111111
我使用字母A代表10.它就像二项式系数一样,但是我们在电路板上丢失了一些。然而,很快就会发生变化。下一步:
OOOF51 OXXA41 OXX631 654321 111111
注意使用F代替15.现在事情变得有趣了。由于我们无法通过障碍物,因此我们将0与障碍物中的细胞相关联。要填写右上角的空白,我们添加F + 0 = F.类似地,0 + 6 = 6。
OOFF51 OXXA41 6XX631 654321 111111
下一步:
OFFF51 6XXA41 6XX631 654321 111111
最后一步:
UFFF51 6XXA41 6XX631 654321 111111
我在这里使用U代表21 = F + 6.这就是问题的答案。
该程序一般有效。我们可以在右侧和下方填写我们知道数字的任何单元格,然后逐渐填写整个矩形。
答案 1 :(得分:0)
我发现很难理解算法的描述,因此我不确定如何帮助解决这个问题。但是,我认为找到路径数量的一种方法是从总可能路径中减去包含子矩形中的单元格的路径。
包含特定单元格的路径数等于从左上角到该单元格的路径数,再乘以从该单元格到右下角的路径数。由于您只能向下或向右移动,因此考虑子矩形的左列和顶行足以说明所有这些。
如果您从子矩形的左上角开始,则可以按照以下示例进行操作(ABCDEF
构成子矩形):
start X X X X
X A B C X
X D E F X
X X X X end
The sum of paths that include A,B,C,D,E or F equals:
Paths to A * Paths from A to end = 2 choose 1 * 5 choose 2 = 20
+ (Paths to cell above B) * Paths from B to end = 1 * 4 choose 2 = 6
+ (Paths to cell above C) * Paths from C to end = 1 * 3 choose 1 = 3
+ (Paths to cell left of D) * Paths from D to end = 1 * 4 choose 1 = 4
Solution equals: total paths - the number of paths that include A,B,C,D,E or F
= 7 choose 3 - (20 + 6 + 3 + 4) = 2
JavaScript代码:
function f(Rows,Cols,r1,c1,r2,c2){
var r = Rows - r1,
total = C(Rows + Cols - 2,Rows - 1),
s = C(r1 + c1 - 2,r1 - 1) * C(Cols - c1 + r,r);
if (c2 > c1 && r1 > 1){
for (var i=c1+1; i<=c2; i++){
s += C(i + r1 - 3,i - 1) * C(Cols - i + r,r);
}
}
if (r2 > r1 && c1 > 1){
for (var i=r1+1; i<=r2; i++){
s += C(i + c1 - 3,i - 1) * C(Rows - i + Cols - c1,Rows - i);
}
}
return total - s;
}
function C(n,k){if(k==0||n==k)return 1;var p=n;for(var i=2;i<=k;i++)p*=(n+1-i)/i;return p}
输出:
console.log(f(4,5,2,2,3,4));
2
console.log(f(5,6,2,2,3,3));
21
console.log(f(8,12,5,5,8,8));
7008