Paste will expire never.
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <string>
- #include <string.h>
- #include <cmath>
- #include <queue>
- #include <vector>
- #include <map>
- #include <stdlib.h> // for exit(0)
- #include <stack>
- #include <list>
- #include <ctime>
- #include <set>
- using namespace std;
- const int MAX_HEIGHT = 5;
- const int MAX_MASK = (1 << MAX_HEIGHT) - 1;
- bool adj_mask[MAX_MASK + 1][MAX_MASK + 1];
- int dp[35][MAX_MASK + 1];
- int MASK;
- int n,m;
- void input(){
- scanf("%d %d", &n, &m);
- if(n > m) swap(n,m);
- MASK = (1 << n) - 1;
- }
- inline int get_bit(int num, int bit) {
- return num & (1 << bit) ? 1 : 0;
- }
- void precalc_matrix() {
- for (int prv = 0; prv <= MASK; ++prv) {
- for (int cur = 0; cur <= MASK; ++cur) {
- bool isComp = true;
- for (int bit = 0; bit < n - 1; ++bit) {
- int sum = get_bit(prv,bit) + get_bit(prv, bit + 1) +
- get_bit(cur,bit) + get_bit(cur, bit + 1);
- if (sum == 0 || sum == 4) {
- isComp = false;
- break;
- }
- }
- adj_mask[prv][cur] = isComp;
- }
- }
- }
- void solve(){
- for (int mask = 0; mask <= MASK; ++mask)
- dp[0][mask] = 1;
- for (int k = 1; k < m; ++k) {
- for (int prv = 0; prv <= MASK; ++prv) {
- for (int cur = 0; cur <= MASK; ++cur) {
- if (adj_mask[prv][cur])
- dp[k][cur] += dp[k-1][prv];
- }
- }
- }
- }
- void output() {
- int res = 0;
- for (int mask = 0; mask <= MASK; ++mask)
- res += dp[m-1][mask];
- printf("%d", res);
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- input();
- precalc_matrix();
- solve();
- output();
- return 0;
- }
Editing is locked.