状压dp

#include
#include
#include
using namespace std;
const int maxn=1e6;
const int mod=1e9;
int dp[15][(1<<11)+100];//空间可优化至dp[2][];dp[r][j]:至r行j状态的方案数
int mp[15][15];
int n,m;
int a[maxn];
int mp_jud(int r,int st)
{
    for(int i=m-1;i>=0;i--,st=st>>1) if(!mp[r][i]&&(st&1)) return 0;
    return 1;
}
int st_jud(int st)
{
    while(st)
    {
        if((st&1)&&((st>>1)&1)) return 0;
        st=st>>1;
    }
    return 1;
}
void init() //可用来优化时间
{
    int num=0;
    for(int i=0;i<(1<<11);i++)
    {
        if(st_jud(i)) a[num++]=i;
    }
}
int two_jud(int st1,int st2)
{
    while(st1&&st2)
    {
        if((st1&1)&&(st2&1)) return 0;
        st1=st1>>1;
        st2=st2>>1;
    }
    return 1;//忘记bug
}
int solve()
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++) //与从0行读入数据不符bug
    {
       for(int j=0;j<(1<

你可能感兴趣的:(Dp)