2019.01.24 NOIP训练 旅行(轮廓线dp)
传送门
题意简述:
给一个n∗mn*mn∗m的有障碍的网格图,问你从左上角走到左下角并覆盖所有可行格子的路径条数。
思路:
路径不是很好算。
将图改造一下,在最前面添两列,第一列全部能通过,第二列只有最上面的和最下面的可以通过,就转化成了求回路方案数。
代码:
#include<bits/stdc++.h>
#define ri register int
#define change (f[cur].insert(stat,sum))
using namespace std;
typedef long long ll;
const int mod=2e6+7;
int n,m,mp[20][20],zx,zy;
ll ans=0;
bool cur;
char s[20];
struct Statement{
ll sum[mod];
int sta[mod],idx[mod],tot;
inline void clear(){tot=0,memset(idx,-1,sizeof(idx));}
inline void insert(int stat,ll sums){
int pos=stat%mod;
if(!pos)++pos;
while(~idx[pos]&&sta[idx[pos]]!=stat)pos=pos==mod-1?1:pos+1;
if(~idx[pos])sum[idx[pos]]+=sums;
else sum[idx[pos]=++tot]=sums,sta[tot]=stat;
}
}f[2];
inline int getbit(int x,int p){return (x>>((p-1)<<1))&3;}
inline void update(int&x,int p,int v){x^=(getbit(x,p)^v)<<((p-1)<<1);}
inline int findr(int stat,int p){
for(ri i=p+1,cnt=1,bit;i<=m+1;++i){
bit=getbit(stat,i);
if(bit==1)++cnt;
if(bit==2)--cnt;
if(!cnt)return i;
}
}
inline int findl(int stat,int p){
for(ri i=p-1,cnt=-1,bit;i;--i){
bit=getbit(stat,i);
if(bit==1)++cnt;
if(bit==2)--cnt;
if(!cnt)return i;
}
}
inline void solve(){
f[cur=0].clear(),f[cur].insert(0,1);
for(ri i=1;i<=n;++i){
for(ri j=1;j<=m;++j){
f[cur^=1].clear();
ll sum;
for(ri stat,p,q,tt=1;tt<=f[cur^1].tot;++tt){
stat=f[cur^1].sta[tt],sum=f[cur^1].sum[tt];
p=getbit(stat,j),q=getbit(stat,j+1);
if(!mp[i][j]){if(!(p+q))change;continue;}
if(!(p+q)){if(mp[i+1][j]&&mp[i][j+1])update(stat,j,1),update(stat,j+1,2),change;continue;}
if((p>0)^(q>0)){
if(mp[i+(p>0)][j+(q>0)])change;
if(mp[i+(q>0)][j+(p>0)])update(stat,j,q),update(stat,j+1,p),change;
continue;
}
if(p==1&&q==2){if(i==zx&&j==zy)ans+=sum;continue;}
update(stat,j,0),update(stat,j+1,0);
if(p==2&&q==1){change;continue;}
if(p==1&&q==1){update(stat,findr(stat,j+1),1),change;continue;}
if(p==2&&q==2){update(stat,findl(stat,j),2),change;continue;}
}
}
for(ri j=1;j<=f[cur].tot;++j)f[cur].sta[j]<<=2;
}
}
int main(){
memset(mp,0,sizeof(mp)),scanf("%d%d",&n,&m),m+=2;
if(n==1)return puts("1"),0;
for(ri i=1;i<=n;++i)mp[i][1]=1;
mp[1][2]=mp[n][2]=1;
for(ri i=1;i<=n;++i){
scanf("%s",s+1);
for(ri j=3;j<=m;++j){
mp[i][j]=1-(s[j-2]-'0');
if(mp[i][j])zx=i,zy=j;
}
}
solve(),cout<<ans;
return 0;
}
2019.01.24 NOIP训练 旅行(轮廓线dp)的更多相关文章
- 2019.01.24 bzoj3125: CITY(轮廓线dp)
传送门 题意简述:给一个n∗mn*mn∗m的网格图,有的格子不能走,有的格子只能竖着走,有的格子只能横着走,问用一条回路覆盖所有能走的格子的方案数. 思路: 就是简单的轮廓线dpdpdp加了一点限制而 ...
- 2019.01.24 bzoj2310: ParkII(轮廓线dp)
传送门 题意简述:给一个m*n的矩阵,每个格子有权值V(i,j) (可能为负数),要求找一条路径,使得每个点最多经过一次且点权值之和最大. 思路:我们将求回路时的状态定义改进一下. 现在由于求的是路径 ...
- 2019.01.23 hdu3377 Plan(轮廓线dp)
传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...
- 2019.01.23 hdu1964 Pipes(轮廓线dp)
传送门 题意简述:给一个没有障碍的网格图,任意两个格子连通需要花费一定代价,现在求一条覆盖所有格子的哈密顿回路的总权值的最小值. 思路: 跟这道题一毛一样,除了把求和变成求最小值以外. 代码: #in ...
- 2019.01.21 NOIP训练 可持久化序列【模板】(可持久化treap)
传送门 题意简述:支持在把某个数插入到某版本的第k个位置,删除某版本第k个数,询问第k个数. 思路:用可持久化treaptreaptreap维护区间第kkk个位置的数是啥就可以了. 代码
- 2019.01.21 NOIP训练 ak树(点分治)
传送门 题意简述:给一棵带权树,问在上面随机选两个点距离是4的倍数的概率. 思路: 由于总方案数为定值n2n^2n2,所以只用求总方案数. 这个跟聪聪可可差不多,可以用类似树形dpdpdp的方法边点分 ...
- 2019.01.02 NOIP训练 三七二十一(生成函数)
传送门 生成函数基础题. 题意简述:求由1,3,5,7,9这5个数字组成的n位数个数,要求其中3和7出现的次数都要是偶数. 考虑对于每个数字构造生成函数. 对于1,5,9:∑nxnn!=ex\sum_ ...
- 2019年9月训练(贰)区间DP (luogu 4290)
区间DP luogu 4290 明显的区间DP. 定义 dp[l][r][k]/*表示区间[l,r]能否凑成k(W,I,N,G)字符*/mp['W']=1;mp['I']=2;mp['N']=3;mp ...
- 2019年9月训练(壹)数位DP (HDU 2089)
开学之后完全没时间写博客.... HDU 2089 不要62(vjudge) 数位DP 思路: 题目给出区间[n,m] ,找出不含4或62的数的个数 用一个简单的差分:先求0~m+1的个数,再减去0~ ...
随机推荐
- AJAX模板
$.ajax({ type:"",//Ajax请求的提交方式(GET或POST) dataType:"text",//请求的类型 url:"" ...
- H5入门
1.基本骨架 <!DOCTYPE html> <html> <head><title>标题</title><meta charset= ...
- PHPlaravel中从数据库中选择数据是增加时间条件及各种条件
注:附加条件后要加get函数. 1.public function getForDataTable($startTime,$endTime){ return $this->query() -&g ...
- c#: PointToClient与PointToScreen
起因: 很早就见过这两个方法,却未曾深入研究,偶尔一用,却纠结于其转换方法,遂写Demo以求验证,记录认知以做备忘. 其为Control类的内置方法,原型为: // // 摘要: // 将指定屏幕点的 ...
- Django的rest_framework的视图之Mixin类编写视图源码解析
Mixin类编写视图 我们这里用auther表来做演示,先为auther和autherdetail写2个url url(r'^autherdetail/(?P<id>\d+)', view ...
- Linux安装命令出现如下错误:cannot find a valid baseurl for repo :base/7x86_64
今天刚回到家,在我的虚拟机上有安装了一个Linux系统,安装好之后,想要安装如下命令,yum install wget,yum install gcc,yum install vim,发现一个也没有安 ...
- Oracle_高级功能(1) 数据库设计
1.三范式规范化关系模式称为范式.第一范式:在一个关系模型R中,如果R的每一个属性的值域中的值都是不可再分的最小数据单位, 则称R为第一范式(1NF).第二范式:如果一个关系模型R属于1NF,并且R的 ...
- PAT 甲级 1023 Have Fun with Numbers(20)(思路分析)
1023 Have Fun with Numbers(20 分) Notice that the number 123456789 is a 9-digit number consisting exa ...
- poj 2777(线段树+lazy思想) 小小粉刷匠
http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...
- Ant.OutputIsUnreadableCode
Ant在Mac OS X终端中的输出乱码的问题 1. 问题: 在用Ant脚本进行构建Android App时,在编译失败时,Ant 输出有乱码. 2. 环境: Mac OS X, 简体中文版.在Ter ...