状态压缩的dp
Code:
/**************************************************************
Problem: 1087
User: wohenshuai
Language: C++
Result: Accepted
Time:120 ms
Memory:19344 kb
****************************************************************/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL unsigned long long
using namespace std;
LL bit[1100];
LL n,m;
void Input()
{
scanf("%lld%lld",&n,&m);
for(LL i=1;i<=n+1;i++)
bit[i]=1<<(i-1);
}
LL ans;
LL cnt[1100]; LL len;
LL f[1100][1100];
LL Count[1100];
void Print()
{
len=0; memset(cnt,0,sizeof(cnt));
memset(f,0,sizeof(f));
for(LL i=0;i<bit[n+1];i++)
{
bool bk=true;
for(LL j=2;j<n;j++)
{
LL dx,dy,dz;
dx=(i&bit[j-1]);
dy=(i&bit[j]);
dz=(i&bit[j+1]);
if(((dx==bit[j-1])&(dy==bit[j]))||((dy==bit[j])&(dz==bit[j+1])))
{
bk=false; break;
}
}
if(bk==true)
{
cnt[++len]=i;
for(LL j=1;j<=n;j++)
if((i&bit[j])==bit[j])
Count[len]++;
}
}
for(LL i=1;i<=len;i++)
{
for(LL j=1;j<=len;j++)
{
if((!(cnt[i]&cnt[j]))&&(!(cnt[i]&(cnt[j]<<1)))&&(!(cnt[i]&(cnt[j]>>1))))
{
f[i][j]=1;
}
}
}
}
LL dp[10][100][1100];
LL Dp()
{
for(LL i=1;i<=len;i++) dp[1][Count[i]][i]+=1;
for(LL i=2;i<=n;i++)
{
for(LL j=1;j<=len;j++)
{
for(LL k=1;k<=len;k++)
{
if(f[j][k])
{
for(LL p=0;p<=m;p++)
dp[i][p+Count[k]][k]+=dp[i-1][p][j];
}
}
}
}
LL ans=0;
for(LL i=1;i<=len;i++)
ans+=dp[n][m][i];
return ans;
}
void Solve()
{
Print();
printf("%lld\n",Dp());
}
int main()
{
Input();
Solve();
return 0;
}