博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷——P1896 [SCOI2005]互不侵犯
阅读量:4360 次
发布时间:2019-06-07

本文共 875 字,大约阅读时间需要 2 分钟。

 

状压DP入门题

 

状压DP一般需要与处理状态是否合法,节省时间

设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数

$dp[i][j][num[j]+p]+=dp[i-1][k][p]$

转移方程如上,表示第i行第j个状态国王数量为$num[j]+p$由上一行第k个状态的p个国王转移而来

 

状压DP的一般套路不就是将数的二进制表示成状态,如1010(10)10这个数就表示第一个位置放,第二个不放,以此类推

预处理:判断这一行的国王是否冲突,i&(i<<1) 想象成二进制,将i左移一位与i比较判断国王是否相邻

如何判断上下两行国王是否冲突呢?

x&y判断上下是否冲突

x&(y<<1) 判断左上右下是否冲突

x&(y>>1) 判断右上左下是否冲突

 

 

#include
#define LL long longusing namespace std;LL MAX,n,m,dp[20][1005][400],can[5000],num[5000],tot,ans;LL getsum(LL x){ LL cnt=0; while(x) cnt+=(x&1),x>>=1; return num[tot]=cnt;}int main(){ scanf("%lld%lld",&n,&m); MAX=(1<
>1))) continue; for(LL p=0;p<=m;p++) dp[i][j][num[j]+p]+=dp[i-1][k][p]; } } } for(LL i=1;i<=tot;i++) ans+=dp[n][i][m]; printf("%lld\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/song-/p/9621285.html

你可能感兴趣的文章
Insert Interval & Merge Intervals
查看>>
大型.NET项目的目录、编译和版本管理实践 三
查看>>
Delphi UniDAC 通过http协议连接数据库的设置
查看>>
MongoDB学习(一)简介
查看>>
GDB调试命令速查 (太经典了!)
查看>>
H3C设备系列问题
查看>>
zookeeper集群配置
查看>>
小学四则运算自动生成程序
查看>>
Oracle_PL/SQL(10) 定时器job
查看>>
Jquery的普通事件和on的委托事件
查看>>
[leedcode 77] Combinations
查看>>
[leedcode 155] Min Stack
查看>>
IE低版本兼容的感悟
查看>>
关于MYsql 多字段排序
查看>>
Java8学习笔记(六)--Optional
查看>>
1196:踩方格
查看>>
django 模板语法和三种返回方式
查看>>
浏览器的默认样式
查看>>
D3学习之动画和变换
查看>>
简单的JQuery top返回顶部
查看>>