loj10170. 「一本通 5.4 例 1」骑士
思路:
每行压缩成一个二进制数。
实际上这道题我自己没做出来,最后抄的标程。。。
#include<cstdio> #include<iostream> #include<cstring> #define ll long long using namespace std; ll ans, n, k, num[300], s0, s[300]; ll f[15][300][110]; void init(){ int i, j, k; s0 = ans = 0; memset(f, 0, sizeof(f)); for(i = 0; i < (1 << n); ++i){ if(i & (i << 1)) continue; k = 0; for(j = 0; j < n; ++j) if(i & (1 << j)) k++; s[++s0] = i; num[s0] = k; } } void dp(){ int i, j, kk, t; f[0][1][0] = 1; for(i = 1; i <= n; ++i) for(j = 1; j <= s0; ++j) for(kk = 0; kk <= k; ++kk) if(kk >= num[j]) for(t = 1; t <= s0; ++t) if(!(s[t] & s[j]) && !(s[t] & (s[j] << 1)) && !(s[t] & (s[j] >> 1))) { f[i][j][kk] += f[i - 1][t][kk - num[j]]; } for(i = 1; i <= s0; ++i) ans += f[n][i][k]; cout << ans << endl; } int main(void){ cin >> n >> k; init(); dp(); return 0; }