洛谷可以过的,但是牛客只能过90%样例
牛客链接:https://ac.nowcoder.com/acm/problem/20240
本人代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> vec;
int sum[1 << 15];
int f[20][20][1 << 15];
int n, m;
int getsum(int x) {
int cnt = 0;
while(x) {
cnt += x & 1;
x >>= 1;
}
return cnt;
}
signed main() {
cin >> n >> m;
for(int i = 0; i < 1 << n; i++) {
sum[i] = getsum(i);
if( (i & (i << 1)) or (i & (i >> 1)) or sum[i] > m) continue;
vec.push_back(i);
}
for(auto i : vec) {
f[0][sum[i]][i] = 1;
}
for(int i = 1; i < n; i++) {
for(auto j : vec) {
for(auto k : vec) {
if(j & k) continue;
if(j & (k << 1)) continue;
if(j & (k >> 1)) continue;
for(int s = m; s >= sum[j]; s--) {
f[i][s][j] += f[i - 1][s - sum[j]][k];
}
}
}
}
int ans = 0;
for(auto i : vec) {
ans += f[n - 1][m][i];
}
cout << ans << endl;
return 0;
}