링크 :
https://codeforces.com/contest/1228/problem/B
질문의 의미 :
빈 또는 전체 세포로 구성된 그리드 w × 아이 가정하자. 의 몇 가지 정의를 만들어 보자 :
RI는 i 행 (1≤i≤h)의 좌측에 연결되어 연속적 전체 세포의 수이다. i 번째 행의 최 좌측 셀이 비어 있으면 특히, RI = 0.
CJ는 j 번째 열 (1≤j≤w)의 상단부에 연결된 연속 된 전체 세포의 수이다. 특히, CJ = 0에서 j 번째 열의 최상위 셀이 비어있는 경우.
즉, i 번째 행은 정확하게 리 전체 세포로 시작합니다. 마찬가지로 j 번째 열은 정확히 CJ 전체 셀 시작한다.
다음은 몇 가지 3 × 4 격자의 R 및 C 값입니다. 블랙 세포가 가득과 흰색 세포가 비어 있습니다.
당신은 R과 C의 값을 갖는다. 처음에는 모든 셀이 비어 있습니다. R과 C의 값을 만족시키기 위해 그리드 셀을 채울 수있는 방법의 수를 찾을 수 있습니다. 응답이 매우 클 수 있기 때문에, 응답 모듈 1,000,000,007 (109 + 7) 발견. 즉, 1,000,000,007 (109 + 7)에 의한 응답의 분할 후에 나머지를 검색.
아이디어 :
사례 하나 하나가 걸릴 수 있습니다, 각각의 위치를 열거합니다.
코드 :
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;
int r[1100], c[1100];
int h, w;
bool Check(int x, int y, int op)
{
if (y == 1 && r[x] == 0 && op == 1)
return false;
if (x == 1 && c[y] == 0 && op == 1)
return false;
if (y == r[x]+1 && op == 1)
return false;
if (x == c[y]+1 && op == 1)
return false;
if (y <= r[x] && op == 0)
return false;
if (x <= c[y] && op == 0)
return false;
return true;
}
int main()
{
cin >> h >> w;
for (int i = 1;i <= h;i++)
cin >> r[i];
for (int i = 1;i <= w;i++)
cin >> c[i];
int res = 1;
for (int i = 1;i <= h;i++)
{
for (int j = 1;j <= w;j++)
{
int tmp = 0;
if (Check(i, j, 0))
tmp++;
if (Check(i, j, 1))
tmp++;
// cout << i << ' ' << j << ' ' << tmp << endl;
res = (res*tmp)%MOD;
}
}
printf("%d\n", res);
return 0;
}