首页 > 其他分享 >状压DP

状压DP

时间:2023-04-04 22:13:19浏览次数:35  
标签:cnt false int 状压 DP dp

[acwing]291. 蒙德里安的梦想

/*
	横放的方案数就等于总方案数,因为横着放完后,再竖着放是唯一的

	dp[i][j] 表示第 i 列状态为 j 的方案数
	状态为 j 是指:各行用 0 或 1 表示摆放状态
			     :若某行为 0,表示竖放或由前一列伸出
			     :若某行为 1,表示横放并向后一列伸出
			   
	dp[i][j] = ∑ dp[i - 1][k],要求 k 和 j 要兼容
	k 和 j 要兼容表示:k | j 不能有连续奇数个 1,否则的话竖着无法放下
		        :k & j == 0 必须成立,不然都横着放有冲突
				   
	dp[0][0] = 1
	
	dp[m][0]
*/
#include <iostream>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 12, M = 1 << N;

int n, m;
LL dp[N][M];
bool st[M]; // k | j 的结果状态是否兼容

int main()
{
    while (cin >> n >> m && (n || m))
    {
        for (int i = 0; i < 1 << n; i++) // 遍历所有的结果状态
        {
            st[i] = true;
            int cnt = 0; // 此状态连续的 0 的个数
            for (int j = 0; j < n; j++)
            {
                if (i >> j & 1) // 如果遇到 1
                {
                    if (cnt & 1) // 如果 cnt 是奇数
                    {
                        st[i] = false;
                        break;
                    }
                    cnt = 0;
                }
                else // 如果遇到 0
                    cnt++;
            }
            if (cnt & 1) st[i] = false; // 处理高位 0 
        }
        
        memset(dp, 0, sizeof(dp)); // 多次询问每次都要清空 dp 数组
        dp[0][0] = 1;
        for (int i = 1; i <= m; i++) // 枚举 m 列
            for (int j = 0; j < 1 << n; j++) // 枚举第 i 列的状态
                for (int k = 0; k < 1 << n; k++) // 枚举第 i - 1 列的状态
                {
                    if ((j & k) == 0 && st[j | k])
                        dp[i][j] += dp[i - 1][k];
                }
                
        cout << dp[m][0] << endl;
    }
    
    return 0;
}

标签:cnt,false,int,状压,DP,dp
From: https://www.cnblogs.com/cong0221/p/17288075.html

相关文章

  • 【Deep Learning】DDPM
    DDPM1.大致流程1.1宏观流程1.2训练过程1.3推理过程2.对比GAN2.1GAN流程2.2相比GAN优点训练过程更稳定,损失函数指向性更强(loss数值大小指示训练效果好坏)3.详细流程3.1扩散阶段如下图,X0为初始干净图像,XT由X0逐步添加噪声所得到具体到一次Xt-1到Xt的扩散......
  • JDK ThreadPoolExecutor核心原理与实践
    一、内容概括本文内容主要围绕JDK中的ThreadPoolExecutor展开,首先描述了ThreadPoolExecutor的构造流程以及内部状态管理的机理,随后用大量篇幅深入源码探究了ThreadPoolExecutor线程分配、任务处理、拒绝策略、启动停止等过程,其中对Worker内置类进行重点分析,内容不仅包含其工作原理,......
  • wordpress粘贴图片自动上传到服务器(Java版)
    ​ 这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@     page contentType="text/html;cha......
  • oracle数据库按用户备份恢复,使用 expdp、impdp
    1,在数据库本机执行su-oracle切换oracle用户sqlplys/assysdba使用超级用户登select*fromdba_directories;查看管理员目录,一般会存在几个。2,导出命令,expdpuser/passwd@orclschemas=userdumpfile=expdp.dmpdirectory=DATA_PUMP_DIRlogfile=expdp.log##......
  • Oracle 停止impdp或expdp过程
    Oracle在执行impdp或expdp过程中如果不想执行按Ctrl+C中断,但进程并未中断仍在后台运行,可以看导出的文件大小一直在长expdp正确停止过程:1.查看正在运行的job,可以发现自己的job还在执行select*fromdba_datapump_jobs;2.根据上面job_name进入到刚才执行的expdp下expdpsy......
  • 驱动开发:内核使用IO/DPC定时器
    本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔,微秒级别间隔,就需要用到DPC定时器,如果是秒级定时其两者基本上无任何差......
  • 驱动开发:内核使用IO/DPC定时器
    本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔,微秒级别间隔,就需要用到DPC定时器,如果是秒级定时其两者基本上无任何差异......
  • Chisel3 使用 DPI-C,发现在 Chisel 环境下 printf 没问题,但是 set_pc 死活传不到 cpp
    大概率是因为你使用了SignExt之类的封装这类封装只会把”值“传给DPI-C,而不会把线连给DPIC,即,传过去的是调用set_pc时的值,而不是引用这样会造成CPP获取不了相应线路的指针 如下图     这些也是错的......
  • 多线程任务怎么选 Thread,ThreadPoll,Task
    提问多线程任务怎么选Thread,ThreadPoll,Task回答Task原因Thread:创建销毁代价昂贵ThreadPoll:管理线程资源Task基于线程池......
  • HDU 2196 Computer(树形DP) 入门模板
    ComputerTimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):34313    AcceptedSubmission(s):5345 ProblemDescriptionAschoolboughtthefirstcomputersometimeago(sothiscomputer'sidis1).D......