lanqiao OJ 246 矩阵计数

简介: lanqiao OJ 246 矩阵计数

用户登录

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std ; 
const int N = 6 ; 
int row[1<<N] ;//记录行的合法排列,(记得数组开大!!!) 
int n , m ;
int f[N][1<<N][1<<N] ;//当前第i行的状态为row[j]并且第i-1行状态为row[k]的方案数 
 
bool check(int x){//判断行合法性 
  int num = 0 ;
  while(x > 0){
    if((x&1) == 1) num ++ ;
    else num = 0 ;
    if(num >= 3) return true ;
    x >>= 1 ;
  }
  return false ;
}
 
int main(){
  cin >> n >> m ;
  memset(row,0,sizeof(row)) ;
  int t = 0 ;
  for(int i = 0 ; i < (1 << m) ; i++){//记录行合法性 
    if(!check(i)){
      row[t] = i ;
      t ++ ;
    }
  }
  memset(f,0,sizeof(f)) ;
  for(int i = 0 ; i< t ; i++) f[0][row[i]][0] = 1 ;//第一行初始化,第一行的没有前一行,所以我们把前一行看作是0状态,因为他不会和任何一个冲突 
  
  for(int i = 1 ; i < n ;i ++){//遍历每一行 
    for(int j = 0; j < t ; j ++){//遍历每一行的状态 
      for(int k = 0 ; k < t ; k ++){//遍历上一行的状态 
        for(int p = 0 ; p < t ; p ++){//遍历上一行的上一行的状态 
          if(((row[j] & row[k]) & row[p]) == 0){//这三行不能连续三个1 
            f[i][row[j]][row[k]] += f[i-1][row[k]][row[p]] ;
          }
        }
      }
    }
  }
  long long ans = 0 ;//最后一行的所有组合和就是答案 
  for(int i = 0 ; i < t ; i ++){
    for(int j = 0 ; j < t ; j ++){
      ans += f[n-1][row[i]][row[j]] ;
    }
  }
  cout << ans << endl ;
} 
目录
相关文章
|
1月前
lanqiao OJ 644 方格分割
lanqiao OJ 644 方格分割
15 1
|
1月前
lanqiao OJ 239 最优包含
lanqiao OJ 239 最优包含
14 2
|
5月前
|
存储
【洛谷 P1255】数楼梯 题解(递归+记忆化搜索+高精度)
这是一个使用动态规划解决的“数楼梯”问题。给定楼梯数`N`,求不同上楼方式的数量。程序通过递归函数`f()`计算,其中`f(x) = f(x - 1) + f(x - 2)`,初始条件`f(1) = 1`,`f(2) = 2`。考虑到数据规模可能很大,使用了高精度加法运算。样例输入`4`,输出`5`。代码中定义了一个存储中间结果的向量`mem`,并提供了一个用于显示高精度数的`printv()`函数。
97 0
|
1月前
acwing 1097 池塘计数
acwing 1097 池塘计数
27 0
|
1月前
lanqiao oj 1628 最短循环节问题
lanqiao oj 1628 最短循环节问题
7 0
|
1月前
|
人工智能 Java BI
lanqiao OJ 111 区间位移
lanqiao OJ 111 区间位移
12 0
|
5月前
【洛谷 P2249】【深基13.例1】查找(向量+二分查找+循环)
该题目要求在一个单调不减的整数序列中查找给定数值首次出现的位置,输出-1表示未找到。给定$n$个整数和$m$次询问,需对每个询问使用二分查找法高效解答。样例输入为11个数和3次询问,输出分别为1、2和-1。代码中定义了快速读取整数的函数`read()`,并使用二分查找`search()`实现。在主函数中,先读取序列和询问,然后对每个询问进行二分查找并输出结果。
31 0
|
算法
代码随想录算法训练营第五十三天 | LeetCode 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和
代码随想录算法训练营第五十三天 | LeetCode 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和
60 1
|
6月前
【每日一题Day122】LC1237找出给定方程的正整数解 | 双指针 二分查找
【每日一题Day122】LC1237找出给定方程的正整数解 | 双指针 二分查找
40 0
|
算法 C++ Python
每日算法系列【LeetCode 829】连续整数求和
每日算法系列【LeetCode 829】连续整数求和
117 0