构造一个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. C++学习 2 指针

    指针:指针保存的是数据的地址: #include<iostream> using namespace std; int main() { //1.定义指针 int a = 10; //指针 ...

  2. 3D Analyst Tools(3D Analyst 工具)

    3D Analyst 工具 工具里有又细分如下分类: 注:以下代码的参数需要另行配置,不能直接执行:Python2不支持中文变量! 1.3D 要素 # Process: 3D 内部 arcpy.Ins ...

  3. iOS Swift结构体与类的方法调度

    前言 hello,小伙伴们:在忙碌中闲暇之余给大家聊聊swift的知识点,今天给大家带来的是swift中结构体与类的方法调度详细区别,希望对你有所帮助,好了废话不用多说,接下来步入主题! 1.普通方法 ...

  4. CountBoard 是一个基于Tkinter简单的,开源的桌面日程倒计时应用

    CountBoard 是一个基于Tkinter简单的,开源的桌面日程倒计时应用. 项目地址 https://github.com/Gaoyongxian666/CountBoard 基本功能 置顶功能 ...

  5. Java(3)基本数据类型及其类型转换

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201501.html 博客主页:https://www.cnblogs.com/testero ...

  6. Java(12)方法的重载

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201592.html 博客主页:https://www.cnblogs.com/testero ...

  7. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  8. selenium3 利用cookie实现免登陆

    1.首先访问要操作的页面 2.登陆一次,使用Fiddle等工具抓取出cookie 3.按照如下代码,即可成功登陆 from selenium import webdriver url = " ...

  9. 保护模式篇——TLB与CPU缓存

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  10. 全连接层dense作用

    参考来源