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;
}

 

posted @ 2018-08-20 08:59  junk_yao  阅读(184)  评论(0编辑  收藏  举报