【51Nod】1920 空间统计学 状压DP
【题目】1920 空间统计学
【题意】给定m维空间中的n个点坐标,满足每一维坐标大小都在[0,3]之间,现在对于[0,3*m]的每个数字x统计曼哈顿距离为x的有序点对数。\(n \leq 2*10^5,m \leq 9\)。
【算法】状压DP
m范围很小,考虑设计状压DP的状态,可以想到设到达某个坐标j(将m维坐标压成m位四进制数)步数为k(距离等价于步数)的点数,但是难以转移。考虑按维转移,考虑每一维往外走的情况来转移。
设\(f_{i,j,k}\)表示前i维,到达坐标j,步数为k的点数。转移时枚举第i+1维的坐标l,假设坐标j的第i+1维是x,那么:
$$f(i+1,j+(l-x)*4^i,k+|x-l|)+=f(i,j,k)$$
最后统计答案的时候,对于每个点坐标j将f[m][j][~]累加进答案即可。
复杂度\(O(m*4^m*3m*4)\)。
注意:1.时限比较紧,要用读入优化,枚举步数上限3*i等优化常数。2.空间比较紧,要用滚动数组(好像可以不用?)。
#include<cstdio>
#include<cstring>
#include<algorithm>
bool isdigit(char c){return c>='0'&&c<='9';}
int read(){
int s=0,t=1;char c;
while(!isdigit(c=getchar()))if(c=='-')t=-1;
do{s=s*10+c-'0';}while(isdigit(c=getchar()));
return s*t;
}
using namespace std;
const int maxn=270010;
int abs(int x){return x>=0?x:-x;}
int n,m,f[2][maxn][30],b[10],t[maxn];
int main(){
n=read();m=read();
b[0]=1;for(int i=1;i<=m;i++)b[i]=b[i-1]*4;
for(int i=1;i<=n;i++){
int num=0;
for(int j=1;j<=m;j++)num=num*4+read();
f[0][num][0]++;//
t[i]=num;
}
int o=0;
for(int i=0;i<m;i++){//from 0
o=1-o;
for(int j=0;j<b[m];j++)for(int k=0;k<=3*(i-1);k++)f[o][j][k]=0;
for(int j=0;j<b[m];j++){
int x=j/b[i]%4;
for(int k=0;k<=3*i;k++)if(f[1-o][j][k])
for(int l=0;l<=3;l++)f[o][j+(l-x)*b[i]][k+abs(x-l)]+=f[1-o][j][k];
}
}
for(int k=0;k<=3*m;k++){
long long ans=0;
for(int j=1;j<=n;j++)ans+=f[o][t[j]][k];
printf("%lld ",ans);
}
return 0;
}
【51Nod】1920 空间统计学 状压DP的更多相关文章
- 51nod 1673 树有几多愁——虚树+状压DP
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...
- 51nod 马拉松30 C(构二分图+状压dp)
题意 分析 考虑一个图能被若干简单环覆盖,那么一定是每个点恰好一个出度,恰好一个出度 于是类似最小路径覆盖的处理,我们可以把每个点拆成2个点i和i',如果有一条边(i,j),那么将i和j'连起来 那么 ...
- ZOJ3802 Easy 2048 Again (状压DP)
ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 状压dp入门
状压dp的含义 在我们解决动态规划题目的时候,dp数组最重要的一维就是保存状态信息,但是有些题目它的具有dp的特性,并且状态较多,如果直接保存的可能需要三维甚至多维数组,这样在题目允许的内存下势必是开 ...
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- HDU 1074 Doing Homework【状压DP】
Doing Homework Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he ...
- bzoj2004 矩阵快速幂优化状压dp
https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...
随机推荐
- 基于tensorflow 1.x 的检索机器人chatbot-retrieval
Chatbot-retrieval说基于tensorflow的检索机器人,原版的代码路径是 https://github.com/dennybritz/chatbot-retrieval, 但是在te ...
- sublime text3 增加emmett插件
本内容基于Windows环境)一.已安装有Sublime Text3 二.安装Package Control 安装这个后,可以在线安装所需的插件 方法1.Ctrl+~打开控制台,在控制台输 ...
- java学习二 数据类型自动提升 0x开头的数据是 16进制且是int型
变量只能定义一次,不能定义两次, 变量的作用域:当前的大括号与子括号才有效 变量的作用:存储值,取值 整型:向上自动升级,向下强制降级 char,byte,shot参与运算时候自动提升为int型 因为 ...
- UOJ#424 【集训队作业2018】count
题意 我们定义长度为\(n\),每个数为\(1\sim m\)之间的整数且\(1\sim m\)都至少出现一次的序列为合法序列.再定义\(pos(l,r)\)表示这个序列的区间\([l,r]\)之间的 ...
- Integration Guide
This document, along with the samples and Javadoc™ in the IBM Sametime Software Development Kit (SDK ...
- BZOJ2561 最小生成树(最小割)
考虑kruskal的过程:按边权从小到大考虑,如果这条边的两端点当前不连通则将其加入最小生成树.由此可以发现,某条边可以在最小生成树上的充要条件是其两端点无法通过边权均小于它的边连接. 那么现在我们需 ...
- Java8新特性之Stream
原文链接:http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验( ...
- Emacs_快捷键列表
Emacs_快捷键列表 emacs -nw 以终端模式运行emacsLC_CTYPE=zh_CN.UTF-8 emacs C = Control M = Meta = Alt | EscAlt 可以粘 ...
- 如何设置Java虚拟机JVM启动内存参数
Tomcat默认的Java虚拟机JVM启动内存参数大约只有64MB或者128MB,非常小,远远没有利用现在服务器的强大内存,所以要设置Java虚拟机JVM启动内存参数.具体设置方法为: Tomcat修 ...
- 【bzoj1758】 Wc2010—重建计划
http://www.lydsy.com/JudgeOnline/problem.php?id=1758 (题目链接) 题意 给出一棵树,每条边有边权,问选出一条长度为$[L,U]$的路径,使得路径上 ...