构造一个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的更多相关文章

  1. HDU 6984 - Tree Planting(数据分治+状压 dp)

    题面传送门 傻逼卡常屑题/bs/bs,大概现场过得人比较少的原因就是它比较卡常罢(Fog 首先对于这样的题我们很难直接维护,不过注意到这个 \(n=300\) 给得很灵性,\(k\) 比较小和 \(k ...

  2. 洛谷P3038 [USACO11DEC]牧草种植Grass Planting

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  3. AC日记——[USACO11DEC]牧草种植Grass Planting 洛谷 P3038

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  4. 洛谷 P3038 [USACO11DEC]牧草种植Grass Planting

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  5. USACO Grass Planting

    洛谷 P3038 [USACO11DEC]牧草种植Grass Planting 洛谷传送门 JDOJ 2282: USACO 2011 Dec Gold 3.Grass Planting JDOJ传送 ...

  6. P3038 [USACO11DEC]牧草种植Grass Planting

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  7. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  8. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  9. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

随机推荐

  1. Dapr + .NET Core实战(十一)单机Dapr集群

    如何单机部署Dapr集群 第十篇讲过了K8S集群下如何使用Dapr运行程序,但是很多人一直在问如何单机下进行Dapr的负载,这节课我们来聊聊如何单机进行Dapr的负载. 首先要说的是单机下,通过 da ...

  2. 鲲鹏展翅|SphereEx 获华为鲲鹏技术认证

    SphereEx Data Middleware 通过了华为鲲鹏技术认证并加入鲲鹏展翅伙伴计划,未来 SphereEx Data Middleware 产品将继续以分布式能力为基础,以数据安全.分布式 ...

  3. C#开发BIMFACE系列46 服务端API之离线数据包下载及结构详解

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>中通过调用接口成功的创建一个离线数 ...

  4. 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍

    回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 背后的故事 这一节让我们一起学习下 sisyphus 基于函数式的配置和注解 ...

  5. 权限管理RBAC模型概述

    一.什么是RBAC模型 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George ...

  6. mongodb的简单查询

    此篇文章简单的记录一下mongodb 的简单查询操作. 一.数据准备: db.persons.insertMany([ {'userId':1,name:'张三','age':20,'scores': ...

  7. Noip模拟43 2021.8.18

    T1 地一体 可以树形$dp$,但考场没写出来,只打了没正确性的贪心水了$30$ 然后讲题的时候B哥讲了如何正确的贪心,喜出望外的学习了一下 不难发现 每次士兵都会直接冲到叶子节点 从深的点再返回到另 ...

  8. shell脚本自学笔记

    一. 什么是Shell脚本 shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本.事实上,shell脚本就是一些命令的集合. 假如完成某个需求需要一 ...

  9. 架构师之路-redis集群解析

    引子 上篇<架构师之路-https底层原理>里我提到了上面的整体视图,文章也介绍了想要真正能在工作中及时正确解决问题的基本功:原理理解透彻.今天以redis集群解析为例介绍一个及时敏锐的发 ...

  10. Unity的Deferred Shading

    什么是Deferred Shading Unity自身除了支持前向渲染之外,还支持延迟渲染.Unity的rendering path可以通过Edit/Project Settings中的Graphic ...