[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下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
随机推荐
- 洛谷4895 独钓寒江雪 (树哈希+dp+组合)
qwq 首先,如果是没有要求本质不同的话,那么还是比较简单的一个树形dp 我们令\(dp[i][0/1]\)表示是否\(i\)的子树,是否选\(i\)这个点的方案数. 一个比较显然的想法. \(dp[ ...
- NOIP模拟80
学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...
- gin 源码阅读(5) - 灵活的返回值处理
gin 源码阅读系列文章列表: gin 源码阅读(1) - gin 与 net/http 的关系 gin 源码阅读(2) - http请求是如何流入gin的? gin 源码阅读(3) - gin 路由 ...
- Golang通脉之指针
指针的概念 指针是存储另一个变量的内存地址的变量. 变量是一种使用方便的占位符,用于引用计算机内存地址. 一个指针变量可以指向任何一个值的内存地址. 在上面的图中,变量b的值为156,存储在内存地址0 ...
- 初学python-day5 流程控制
流程控制 一.判断语句 1.if语句(单一条件分支) 结构: if 表达式: 为真的时候执行的语句 概述:当程序运行到if语句时候,首页要计算表达式的值,判断真假,如果表达式的职位为真,则执行i ...
- [敏捷软工团队博客]Beta阶段项目展示
团队成员简介和个人博客地址 头像 姓名 博客园名称 自我介绍 PM 测试 前端 后端 dzx 秃头院的大闸蟹 大闸蟹是1706菜市场里无菜可卖的底层水货.大闸蟹喜欢音乐(但可惜不会),喜欢lol(可惜 ...
- BUAA SE | 提问回顾与个人总结
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 深入理解软件工程 这个作业在哪个具体方面帮助我实现目标 ...
- 团队任务拆解(alpha)
团队任务拆解(alpha阶段) 项目 内容 班级:2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业:团队任务拆解 团队任务拆解 我们在这个课程中的目标 写出令客户和自己都满意的代码同 ...
- 并发编程从零开始(六)-BlockingDeque+CopyOnWrite
并发编程从零开始(六)-BlockingDeque+CopyOnWrite 5.2 BlockingDeque BlockingDeque定义了一个阻塞的双端队列接口: 该接口继承了BlockingQ ...
- STM32核心板焊接
焊接工具和材料 电烙铁及烙铁头介绍 电烙铁有很多种,常用的有内热式.外热式.恒温式和吸锡式,为了方便携带,建议使内热式电烙铁,且要带烙铁架和海绵,烙铁架用于放置电烙铁,海绵用于擦拭烙铁锡渣,因此海绵不 ...