[hdu6984]Tree Planting
构造一个01矩阵,其中格子$(i,j)$对应于第$ik+j$个的位置(其中$0\le i<\lceil\frac{n}{k}\rceil,0\le j<k$,位置从0开始编号),那么问题即有以下限制:
1.$(\lceil\frac{n}{k}\rceil-1,j)$(其中$n-(\lceil\frac{n}{k}\rceil-1)k\le j<k$不能被选择(强制为0)
2.$\forall 1\le i<\lceil\frac{n}{k}\rceil$和$0\le j<k$,$(i-1,j)$和$(i,j)$不同时为0
3.$\forall 0\le i<\lceil\frac{n}{k}\rceil$和$0\le j<k$,$(i,j)$和$(i,(j+1)mod\ k)$不同时为0
关于这个问题,考虑状压dp,有两种dp方式:
1.从上到下、从左到右dp,dp到$(i,j)$时记录$(i,[0,j])$和$(i-1,(j,k))$的01状态即可,复杂度为$o(n2^{k})$
2.从左到右、从上到下dp,dp到$(i,j)$时记录$([0,\lceil\frac{n}{k}\rceil),0),([0,i],j)$和$((i,\lceil\frac{n}{k}\rceil),j-1)$的01状态即可,复杂度为$o(n2^{\frac{2n}{k}})$(前者可以初始枚举来方便实现)
将两者合并,即对$k^{2}\le 2n$和$k^{2}>\sqrt{2n}$分别使用第1种和第2种方式dp
同时,注意到状态序列中不能存在相邻的1,因此$2^{n}$对应的合法状态数仅为$F_{n+2}$(其中$F$为斐波那契数列),根据通项公式约为$1.618^{n}$
最终,总复杂度为$o(n\cdot 1.618^{\sqrt{2n}})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 305
4 #define M 200005
5 #define L (1<<24)
6 #define mod 1000000007
7 #define ll long long
8 #define Add(x,y) x=(x+y)%mod
9 vector<int>v;
10 int t,n,k,ans,w[N],vis[L],id[L],f[N<<1][M];
11 int main(){
12 scanf("%d",&t);
13 while (t--){
14 scanf("%d%d",&n,&k);
15 for(int i=0;i<n;i++)scanf("%d",&w[i]);
16 int r=(n+k-1)/k,c=k;
17 ans=mod-1;
18 if (k*k<=2*n){
19 v.clear();
20 for(int i=0;i<(1<<c);i++){
21 vis[i]=((vis[i>>1])|((i&3)==3));
22 if (!vis[i]){
23 id[i]=v.size();
24 v.push_back(i);
25 }
26 }
27 for(int i=0;i<=n;i++)
28 for(int S=0;S<v.size();S++)f[i][S]=0;
29 f[0][0]=1;
30 for(int i=0;i<n;i++)
31 for(int S=0;S<v.size();S++){
32 Add(f[i+1][id[v[S]>>1]],f[i][S]);
33 if ((v[S]&((1<<c-1)|1))==0)Add(f[i+1][id[(v[S]>>1)|(1<<c-1)]],(ll)w[i]*f[i][S]);
34 }
35 for(int S=0;S<v.size();S++)Add(ans,f[n][S]);
36 }
37 else{
38 v.clear();
39 for(int i=0;i<(1<<r);i++){
40 vis[i]=(vis[i>>1])+((i&3)==3);
41 if (vis[i]<=1){
42 id[i]=v.size();
43 v.push_back(i);
44 }
45 }
46 for(int SS=0;SS<v.size();SS++){
47 if (vis[v[SS]])continue;
48 for(int i=0;i<=r*(c-1);i++)
49 for(int S=0;S<v.size();S++)f[i][S]=0;
50 f[0][SS]=1;
51 for(int i=0;i<r;i++)
52 if (v[SS]&(1<<i))f[0][SS]=(ll)w[i*c]*f[0][SS]%mod;
53 for(int j=1;j<c;j++)
54 for(int i=0;i<r;i++){
55 int k=(j-1)*r+i,pos=i*c+j;
56 for(int S=0;S<v.size();S++){
57 Add(f[k+1][id[v[S]>>1]],f[k][S]);
58 if ((pos<n)&&((v[S]&1)==0)&&((!i)||((v[S]&(1<<r-1))==0)))Add(f[k+1][id[(v[S]>>1)|(1<<r-1)]],(ll)w[pos]*f[k][S]);
59 }
60 }
61 for(int S=0;S<v.size();S++)
62 if ((v[S]&(v[SS]>>1))==0)Add(ans,f[r*(c-1)][S]);
63 }
64 }
65 printf("%d\n",ans);
66 }
67 return 0;
68 }
[hdu6984]Tree Planting的更多相关文章
- HDU 6984 - Tree Planting(数据分治+状压 dp)
题面传送门 傻逼卡常屑题/bs/bs,大概现场过得人比较少的原因就是它比较卡常罢(Fog 首先对于这样的题我们很难直接维护,不过注意到这个 \(n=300\) 给得很灵性,\(k\) 比较小和 \(k ...
- 洛谷P3038 [USACO11DEC]牧草种植Grass Planting
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- AC日记——[USACO11DEC]牧草种植Grass Planting 洛谷 P3038
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- 洛谷 P3038 [USACO11DEC]牧草种植Grass Planting
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- USACO Grass Planting
洛谷 P3038 [USACO11DEC]牧草种植Grass Planting 洛谷传送门 JDOJ 2282: USACO 2011 Dec Gold 3.Grass Planting JDOJ传送 ...
- P3038 [USACO11DEC]牧草种植Grass Planting
题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
随机推荐
- 题解 Crash 的文明世界
题目传送门 题目大意 给出一个\(n\)个点的树,和常数\(k\),对于\(\forall i\in[1,n]\),求出: \[\sum_{j=1}^{n} \text{dist}(i,j)^k \] ...
- 题解 CF833D Red-Black Cobweb
题目传送门 题目大意 给出一个 \(n\) 个点的树,每条边有边权和颜色 \(0,1\) ,定义一条链合法当且仅当 \(0,1\) 颜色的边数之比小于等于 \(2\) ,求所有合法的链的边权之积的积. ...
- 攻防世界XCTF-WEB入门全通关
为了更好的体验,请见我的---->个人博客 XCTF的web块入门区非常简单,适合一些刚接触安全或者对网络安全常识比较了解的同学在安全搞累之余娱乐娱乐. 其主要考察下面几点: 基本的PHP.Py ...
- 笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
解决方法:选择Terminal中输入执行ex13.py 1 2 3 执行结果如下图
- 深度剖析Redis6的持久化机制(大量图片说明,简洁易懂)
Redis的强劲性能很大程度上是由于它所有的数据都存储在内存中,当然如果redis重启或者服务器故障导致redis重启,所有存储在内存中的数据就会丢失.但是在某些情况下,我们希望Redis在重启后能够 ...
- 【UE4 C++ 基础知识】<14> 多线程——AsyncTask
概念 AsyncTask AsyncTask 系统是一套基于线程池的异步任务处理系统.每创建一个AsyncTas,都会被加入到线程池中进行执行 AsyncTask 泛指 FAsyncTask 和 FA ...
- Vite启动后提示Network: use `--host` to expose
当使用 Vite 构建项目后,发现只有localhost + 端口 服务,没有 IP + 端口服务. 运行npm run dev,终端提示Vite启动后提示Network: use '--host' ...
- Java:多线程计数
Java:多线程计数 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. CountDownLatch 概念 让一些线程阻塞直到另一些线程完成一系列操作才被唤醒 ...
- (六)、Docker 之 Dockerfile
1.什么是Dockerfile Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 2.Dockerfile解析过程 前提认知: 每条保留字指令都必须为大写字母 ...
- MyBatis源码分析(一):从JDBC到MyBatis 介绍MyBatis的背景,为什么要用MyBatis
一.介绍JDBC JDBC全称Java Database Connectivity,是Java语言规范客户端访问数据库的应用程序接口,所面向的数据库类型为关系型数据库. JDBC的三层架构图: JDB ...