using
System;
class
GFG {
static
int
ways(
int
[, ] arr,
int
K)
{
int
R = arr.GetLength(0);
int
C = arr.GetLength(1);
int
[, ] preSum =
new
int
[R, C];
for
(
int
r = R - 1; r >= 0; r--) {
for
(
int
c = C - 1; c >= 0; c--) {
preSum[r, c] = arr[r, c];
if
(r + 1 < R)
preSum[r, c] += preSum[r + 1, c];
if
(c + 1 < C)
preSum[r, c] += preSum[r, c + 1];
if
(r + 1 < R && c + 1 < C)
preSum[r, c] -= preSum[r + 1, c + 1];
}
}
int
[, , ] dp =
new
int
[K + 1, R, C];
for
(
int
k = 1; k <= K; k++) {
for
(
int
r = R - 1; r >= 0; r--) {
for
(
int
c = C - 1; c >= 0; c--) {
if
(k == 1) {
dp[k, r, c]
= (preSum[r, c] > 0) ? 1 : 0;
}
else
{
dp[k, r, c] = 0;
for
(
int
r1 = r + 1; r1 < R; r1++) {
if
(preSum[r, c] - preSum[r1, c]
> 0)
dp[k, r, c]
+= dp[k - 1, r1, c];
}
for
(
int
c1 = c + 1; c1 < C; c1++) {
if
(preSum[r, c] - preSum[r, c1]
> 0)
dp[k, r, c]
+= dp[k - 1, r, c1];
}
}
}
}
}
return
dp[K, 0, 0];
}
public
static
void
Main(
string
[] args)
{
int
[, ] arr
= { { 1, 0, 0 }, { 1, 1, 1 }, { 0, 0, 0 } };
int
k = 3;
Console.WriteLine(ways(arr, k));
}
}