zoukankan      html  css  js  c++  java
  • SCOI2005互不侵犯

    基础版

    按行转移

    • 两个判断:
      • 本集合(行)内是否冲突
      • 不同行之间是否冲突(即是否互为八个方向之一)
    • 动态转移方程
      • 通过循环来实现
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 15;
    int n, k;
    long long f[N][N * N][1 << N];
    
    int size(int s) 
    {
    int cnt = 0;
    for (; s; s >>= 1) {
    cnt += s & 1;
    }
    return cnt;
    }
    
    bool check(int s) 
    {
    if (s & (s << 1)) return false; //本集合内国王是否冲突 
    return true;
    }
    
    bool check(int s, int t) { //两行之间的国王是否冲突 
    if ((t & s) || (s & (t << 1)) || ((s << 1) & t)) return false;
    return true;
    }
    
    int main() 
    { 
    ios::sync_with_stdio(false);
    cin >> n >> k;
    int m = 1 << n;
    f[0][0][0] = 1; //边界 
    //f[i][j][S]表示正在处理第i行,第i行放的格子集合为S,前i行共放了j个国王 
    for (int i = 1; i <= n + 1; i++) //
    for (int s = 0; s < m; s++) { // 枚举当前行的状态 
    if (check(s))
    for (int t = 0; t < m; t++) { //枚举上一行的状态 
    if (check(t) && check(s, t)) {
    int sz = size(s);
    for (int j = sz; j <= k; j++) //国王个数 
    f[i][j][s] += f[i - 1][j - sz][t]; //由上一行转移来 
    }
    }
    }
    cout << f[n + 1][k][0]; 
    }
    View Code

    (我再去研究下高级版怎么写(逃 )

    满堂花醉三千客,一剑霜寒十四州
  • 相关阅读:
    分治法(待整理)
    NP完全问题
    合并排序
    插入排序
    算法基础知识(算法导论)
    分支定界法
    RUCM简介
    大一编程基础培训]==06课==Python的字符串和编码
    python加密包利用pycrypto包进行AES、DES、MD5等加密
    pyecharts模块
  • 原文地址:https://www.cnblogs.com/phemiku/p/11617174.html
Copyright © 2011-2022 走看看