彩虹(状压dp)

题目link

思路

经典状压 d p dp dp

[ 0 , 7 m ) [0,7^m) [0,7m) 来表示状态每列的涂色状态
注意判断相邻同色的方法!

代码

int qmi(int a,int b){
    int res =1;
    while(b){
        if(b&1) res = res*a;
        a = a*a;
        b >>= 1;
    }
    return res;
}

int n,m;

vector<int> state;

bool check(int x){
    int s = x/7,yu = x%7;
    int len = n;
    int f = 0;
    while(--len){
        if((s%7) == yu){
            f = 1;
            break;
        }
        yu = s%7, s /= 7;
    }
    if(!f) return true;
    return false;
}
bool judge(int l,int r){
    int len = n;
    int st1 = state[l];
    int st2 = state[r];
    int s,t;
    while(len--){
        s=st1%7,t=st2%7;
        if(s==t) return false;
        st1/=7,st2/=7;
    }
    return true;
}
int f[11][100005];
signed main()
{
    cin >> n >> m;

    int sta = qmi(7,n);
    vector<int> get[sta];
    forr(i,0,sta-1){
        if(check(i)) state.push_back(i);
    }

    for(int i = 0 ; i < state.size();i++)
        for(int j = 0; j < state.size();j++)
            if(judge(i,j)) get[i].push_back(j);

    for(int i = 0;i < state.size();i++) f[1][i] = 1;
    forr(i,2,m){
        for(int j = 0;j < state.size();j++){
            for(auto k:get[j]){
                f[i][j]  = (f[i][j]+f[i-1][k]) %mod;
            }
        }
    }
    
    int ans = 0;
      for(int i = 0;i < state.size();i++){
        ans =  (ans+f[m][i])%mod;
    }
    cout << ans << endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值