SGU 220 Little Bishops(状压dp)

题意:n×n的棋盘,放k个棋子,棋子之间在斜线方向会相互攻击,求有多少不同的方案。

思路:把棋盘斜过来,就跟可以dp了。还是挺好想的,但是不知道抽了什么风,越写越复杂,写了好久才写明白。。。


代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-6
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
int mw[25],mk[25],cnt[1<<10],n,k;
ll dp[25][1<<10];
void Init(int n)
{
    mw[n]=n,mk[n]=0;
    if(n>1)
    {
        mw[n-1]=n-1;mk[n-1]=0;
        mw[n+1]=n-1;mk[n+1]=0;
    }
    for(int i=n-2;i>=1;i--)
    {
        mw[i]=mw[i+2]-2;
        mk[i]=mk[i+2]+1;
    }
    for(int i=n+2;i>n>>k;
    Init(n);
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    dp[1][0]=1;
    dp[1][1<


你可能感兴趣的:(dp)