首页 > 其他分享 >状压DP

状压DP

时间:2024-07-15 19:41:53浏览次数:14  
标签:状态 cnt int 状压 dfs DP

状压DP

状压 DP 是动态规划的一种,通过将状态压缩为整数来达到优化转移的目的。

例题

https://www.luogu.com.cn/problem/P1896

思路

一行中所有放置的状态可以用二进制数表示:如01000111(1代表当前位置放置物品)
因此,我们可以先找出所有的合法状态,(利用dfs进行递归)
并用sit[i]记录第i个状态的表示的十进制数,sta[i]记录第i个状态所放置物品数量
然后枚举每一行的状态,并对上一行的状态继承转移(前提是互相合法)
转移方程
image

Code

点击查看代码
const int maxn       = 1e5 + 10;

int n, m;
int sit[maxn], sta[maxn], cnt;
// 当前的状态//当前状态所用的数量//状态总数
int dp[15][2010][110];  // ijk;记录前i行,第i行状态j,总用k个的方案
void dfs(int x, int num, int cur) {
    if (cur >= n) {
        sit[++cnt] = x;
        sta[cnt]   = num;
        return;
    }
    dfs(x, num, cur + 1);
    dfs(x + (1 << cur), num + 1, cur + 2);
}
bool check(int x, int y) {  // 利用位运算的性质判断之间是否合法
    if (sit[x] & sit[y]) return false;
    if ((sit[x] << 1) & sit[y]) return false;
    if (sit[x] & (sit[y] << 1)) return false;
    return true;
}
void solve() {
    cin >> n >> m;
    dfs(0, 0, 0);  // 预处理出一行中所有合法状态
    // 用cnt记录合法状态数量
    for (int i = 1; i <= cnt; i++)  // 对第一行的状态方案赋值
        dp[1][i][sta[i]] = 1;
    for (int i = 2; i <= n; i++) {                            // 枚举行
        for (int j = 1; j <= cnt; j++) {                      // 枚举当前行状态
            for (int k = 1; k <= cnt; k++) {                  // 枚举上一行状态
                if (!check(j, k)) continue;                   // 不合法
                for (int l = sta[j]; l <= m; l++) {           // 枚举全部合适的数量
                    dp[i][j][l] += dp[i - 1][k][l - sta[j]];  // 方案累加
                }
            }
        }
    }
    int ans = 0;
    for (int i = 1; i <= cnt; i++)  // 方案累加
        ans += dp[n][i][m];
    cout << ans;
}

标签:状态,cnt,int,状压,dfs,DP
From: https://www.cnblogs.com/uanQ/p/18303851

相关文章

  • lamp基本架构+wordpress
    一、安装并设置MariaDB1、时钟同步先安装chrony,重启并设置enable,最后同步yum-yinstallchrony2、安装mariadb和httpdyum-yinstallhttpdmariadbmariadb-server将httpd和mariadb重新启动并enable3、设置mariadb数据库进入数据库进行初始化mysql_secure_......
  • TCP和UDP
    【1】TCP服务器#include<stdio.h>#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>#include<netinet/in.h>#include<netinet/ip.h>#include<unistd.h>#include<arpa/inet.h>intmain(intargc,charcon......
  • SAP ABAP 写更改记录到表CDHDR/CDPOS 下篇
    表更改记录上篇写入表更改记录下篇发布日期:2024/07/11继上一篇的内容,用户测试的过程中发现,还是查不到写入记录。最后发现,我使用的系统环境,更改表equp时,对象类是QUOTEN2。基于此,当一个通过表TCDOB能查出多个对象类时,我们最好通过标准功能更改任意一条目标表的数据。再去查......
  • 最喜欢dp动态规划的一次(暑期刷题)
    以积极的态度面对生活,才能感受到人生的美好!dp动态规划-第一天前言1、环绕字符串中唯一的子字符串2、最长递增子序列3、摆动序列4、最长递增子序列的个数5、最长数对链6、最长定差子序列7、最长的斐波那契子序列的长度8、总结前言所有的问题可能不止一种方法,但是由......
  • 合法方案数(dp)
    https://www.luogu.com.cn/problem/CF1606E第3题   合法方案数 查看测评数据信息有n个人,他们要进行下面的进程:每轮设存活i个人,那么每个存活的人会对其他人造成1点血量的代价,血量小于等于零就会被淘汰,现在需要你给他们每个人设置一个在[1,x]之间的初始血量,使得某轮游戏结......
  • WordPress:快速搭建站点,wp安装及模版介绍
    最近搭建个人站点比较多,都是想把业务做到国外,通过google来引流,那我们今年就来介绍一个比较受欢迎的站点平台wordPress。WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个内容管理系统(CMS)来使用......
  • 题解:CodeForces 835 D Palindromic characteristics[区间dp/马拉车Manacher]
    CodeForces835DD.Palindromiccharacteristicstimelimitpertest:3secondsmemorylimitpertest:256megabytes*inputstandardinputoutputstandardoutputPalindromiccharacteristicsofstring\(s\)withlength\(|s|\)isasequenceof\(|s|\)in......
  • [DP] 数位DP
    本文主要内容:数位DP例题数位DP主要有两种方法,填数法和记搜。这里主要研究记搜的实现;模板相比于填数法,记搜的优点在于有固定的模板,实现较容易;缺点在于需要很多$memset$,常数较大,容易被卡;下面通过几道例题来了解记搜模板;一$haha$数设记搜各参数如下:longlongdfs(......
  • DP优化技巧-斜率优化(基础版)
    DP优化技巧-斜率优化(基础版)基本思路:1.寻找出暴力DP转移方程式。例子:f[i]=min{f[j]+v[i]+v[j]+val(i,j)}2.将方程式写成y=kx+b的形式,其中b为与i相关的项,y为与j相关的项,kx对应的是val(i,j)项,其中x对应的的是与j相关的,k对应的是与i相关的以及常数。例子:假设有转移方程f[i]=min{f[......
  • zdppy+onlyoffice+vue3解决文档加载和文档强制保存时弹出警告的问题
    解决过程第一次排查最开始排查的是官方文档说的https://api.onlyoffice.com/editors/troubleshooting#key解决方案。参考的是官方的https://github.com/ONLYOFFICE/document-server-integration/releases/latest/download/Python.Example.zip基于Django的Python代码。......