两个常见模型

bzoj 4321

题意:编号为1~n的人排成一排,问有多少种排法使得任意相邻两人的编号之差不为1或-1。

n<=1000

排列计数问题:考虑把数从小到大插入的过程进行dp。

设 f[i][j] 表示 1∼i 的排列,有 j 组相邻的相差1,且 i 和 i−1 不相邻的方案数;

设 g[i][j] 表示 1∼i 的排列,有 j 组相邻的相差1,且 i 和 i−1 相邻的方案数。

考虑插入i+1的位置,有4种转移方式:

1.不破坏空位且不与 i 相邻

2.不破坏空位且与 i 相邻

3.破坏空位且不与 i 相邻

4.破坏空位且与 i 相邻(只发生在 g 的转移)4种。

答案:f[n][0]

复杂度:O(n^2)


bzoj 2560

题意:有n个珠子,第i和j个珠子之间有c[i][j]条不同的绳子可选。每对珠子之间可以选择不连绳子,也可以选择用其中一种绳子连接,问有多少种方案能使n个珠子成为连通图。

n<=16

连通图计数套路:用总数减去不连通的方案数,不连通的方案数可以枚举1号点所在连通块的点集来计数。用这个点集的连通方案数乘以剩余点集的总方案数即可。

设g[s]表示s点集互相连的总方案数,f[s]表示s点集连通的总方案数。

g[s]直接预处理,从s舍弃最后一个1的点集s0转移即可,g[s]=g[s0] 累乘(c[i][j]+1)(j属于s0的任意一位1)

g预处理的复杂度:O(n*2n)

f[s]就是g[s]减去所有的不合法情况,枚举1号点所在的点集i,不合法的情况就是g[s^i]*f[i],减去这些情况,就能求出f[s]了。

复杂度:O(3n) (枚举子集)

#include<cstdio>
using namespace std;
const int mod=1e9+7;
int c[25][25],stack[25],F[70005],G[70005],ID[70005];
int lowbit(int x){
return x&(-x);
}
int main(){
int n;
scanf("%d",&n);
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
scanf("%d",&c[i][j]);
G[0]=1;
for (int i=0; i<n; i++) ID[1<<i]=i;
for (int i=1; i<(1<<n); i++){
int top=0;
for (int j=i; j; j-=lowbit(j)) stack[++top]=ID[lowbit(j)];
G[i]=G[i-lowbit(i)];
for (int j=2; j<=top; j++) G[i]=1ll*G[i]*(c[stack[1]][stack[j]]+1)%mod;
}
for (int i=1; i<(1<<n); i++){
F[i]=G[i];
for (int j=(i-1)&i; j; j=(j-1)&i)
if (j&lowbit(i)){
F[i]-=1ll*F[j]*G[i^j]%mod;
(F[i]+=mod)%=mod;
}
}
printf("%d\n",F[(1<<n)-1]);
return 0;
}

两种dp模型的更多相关文章

  1. css的两种盒子模型

    css的两种盒子模型:W3C标准盒子模型.IE盒子模型 两者的相同之处:都包含margin.border.padding.content 两者的不同之处:W3C标准盒子模型的content部分不包含其 ...

  2. JMS两种消息模型

    前段时间学习EJB.接触到了JMS(Java消息服务),JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和公布订阅模型. ...

  3. DIV+CSS两种盒子模型(W3C盒子与IE盒子)

    在辨析两种盒子模型之前.先简单说明一下什么叫盒子模型. 原理: 先说说我们在网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS ...

  4. 两种Tensorflow模型保存的方法

    在Tensorflow中,有两种保存模型的方法:一种是Checkpoint,另一种是Protobuf,也就是PB格式: 一. Checkpoint方法: 1.保存时使用方法: tf.train.Sav ...

  5. 以两种异步模型应用案例,深度解析Future接口

    摘要:本文以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类. 本文分享自华为云社区<[精通高并发系列]两种异步模型与深度解析Future接口(一) ...

  6. 【高并发】两种异步模型与深度解析Future接口

    大家好,我是冰河~~ 本文有点长,但是满满的干货,以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类,希望大家踏下心来,打开你的IDE,跟着文章看源码,相 ...

  7. DIV+CSS两种盒子模型

    盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型.他们对盒子模型的解释各不相同, 先来看看我们熟悉的标准盒子模型: 从上图可以看到标准 W3C 盒子模型的范围包括 margin.bord ...

  8. Java NIO学习与记录(八): Reactor两种多线程模型的实现

    Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...

  9. CSS的两种盒模型

    盒模型一共有两种模式,一种是标准模式,另一种就是怪异模式. 当你用编辑器新建一个html页面的时候你一定会发现最顶上都会有一个DOCTYPE标签,例如: <!DOCTYPE HTML PUBLI ...

随机推荐

  1. 剑指offer42:数组和一个数字S,输出两个数的乘积最小的

    1 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. ...

  2. Devepxress xaf Dashboard中DetailView控件使其可编辑

    最开始用Devexpress xaf Dashboard做界面的时候,DetailView界面里面的控件都无法编辑,后来解决了这个问题,记录下来供大家参考. 解决方法:创建ViewController ...

  3. js 替换html

    function getInfo(){ var player_name=$("#name").val(); $.ajax({ url: 'get_wefare', method: ...

  4. C++反汇编第一讲,不同作用域下的构造和析构的识别

    目录大纲: 1.全局(静态)对象的识别,(全局静态全局一样的,都是编译期间检查,所以当做全局对象看即可.) 1.1 探究本质,理解构造和析构的生成,以及调用方式(重要,如果不想知道,可以看总结.) 2 ...

  5. 原生 JS 绑定事件 移除事件

    监听事件的绑定与移除主要是addEventListener和removeEventListener的运用. addEventListener语法 element.addEventListener(ty ...

  6. 对于div里面内容过大根据长度或者宽度进行适配,然后可以滚轮缩放的功能

    在做3000的项目中,因为页面的svg很大,但是做的只是适配电脑,打开肯定是看不全的,要看全就必须进行滚动,可是客户提出了将页面放在电视机上面,用电视输入网址直接访问,这样问题就来了,电视上怎么进行滚 ...

  7. 原生js实现选项卡样式切换的几种方式。

    先分享一个不能实现的实例(因为es5没有块作用域) for(var i=0; i<list.length; i++ ) { list[i].onclick = function(){ tabch ...

  8. SpringCloud多网卡配置(转)

    https://blog.csdn.net/lixiang987654321/article/details/88134324 docker部署过程中遇到如下问题: (1)docker容器创建之后,进 ...

  9. dict 字典 函数值应用

    函数 说明 D代表字典对象   D.clear() 清空字典 D.pop(key) 移除键,同时返回此键所对应的值 D.copy() 返回字典D的副本,只复制一层(浅拷贝) D.update(D2) ...

  10. ARM体系结构与编程读书笔记——处理器的运行模式

    ARM处理器共有7种运行模式,如下表: 处理器模式 描述 用户模式(User, usr) 正常程序执行的模式 快速中断模式(FIQ, fiq) 用于高速数据传输和通道处理 外部中断模式(IRQ, ir ...