Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- // можно ли добавить следующий столбец на основании прошлого
- bool compatible(int a, int b, int m) {
- vector<bool> good(m);
- int bit1, bit2;
- for(int i = 0; i < m; i++)
- good[i] = (a & (1 << i)) != 0;
- for(int i = 0; i < m; i++) {
- bit1 = a & (1 << i);
- bit2 = b & (1 << i);
- if(bit1 && bit2) return false;
- if(bit1 && !bit2) good[i] = true;
- }
- for(int i = 0; i < m - 1; i++) {
- if(!good[i] && !good[i + 1]) {
- good[i] = true;
- good[i + 1] = true;
- }
- }
- for(int i = 0; i < m; i++)
- if(!good[i]) return false;
- return true;
- }
- // генерация таблицы сравнения
- vector< vector<int> > generate_compare_table(int m) {
- vector< vector<int> > compare_table((1 << m), vector<int>(1 << m));
- for(int a = 0; a < (1 << m); a++)
- for(int b = 0; b < (1 << m); b++)
- compare_table[a][b] = compatible(a, b, m);
- return compare_table;
- }
- int main() {
- int m, n;
- vector< vector<int> > dp;
- vector< vector<int> > can;
- cin >> m >> n;
- dp.resize(n + 1, vector<int>(1 << m));
- can = generate_compare_table(m);
- dp[0][0] = 1;
- for(int i = 1; i <= n; i++)
- for(int a = 0; a < (1 << m); a++)
- for(int b = 0; b < (1 << m); b++)
- dp[i][a] += dp[i - 1][b] * can[b][a];
- int ans = dp.back()[0];
- cout << ans << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement