来自FallDream的博客,未经允许,请勿转载,谢谢。


给你一个4*n的棋盘,问从(1,1)出发恰好经过所有格子一次的走法数量.(n<=1000)

插头dp,用f[i][j][k]表示转移到第i行第j列,插头的状态是k的方案数,套上高精度。

假设要转移到格子(i,j) 前一个格子的右插头是p,上一个格子的下插头是q,

p和q都没有插头时,现在这个格子显然只能有向右和向下的插头,插头状态变成()

p和q只有一个有插头时,一个插头只能与这个插头对接,另一个插头可右可下,分别转移

pq都有插头的时候,显然只能和这两个插头对接,考虑维护联通性。

如果两个插头是(),那么会形成一个环,只有在最后一个格子才能转移。

如果两个插头是((或者)),这两个联通块被合并,把这两个插头去掉,然后把他们匹配的两个相同的插头改成()即可。

如果这两个插头是)(,那么直接去掉这两个插头即可。

插头的状态可以与处理,总共只有21种,复杂度O(4*n*21*高精度)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#define MN 2200
#define mod 1000000000
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} struct Hpc
{
int len,s[];
void init(int x){memset(s,,sizeof(int)*(len+));s[]=x;len=(x>);}
void operator += (Hpc y)
{
len=max(len,y.len)+;
for(int i=;i<=len;++i)
{
s[i]+=y.s[i];
if(s[i]>=mod)
{
s[i+]+=s[i]/mod;
s[i]%=mod;
}
}
if(!s[len]) --len;
}
void print()
{
printf("%d",s[len]);
for(int i=len-;i>;--i)
cout<<setw()<<setfill('')<<s[i];
}
}f[][<<],ans;
int n,tot=,s[MN+],c[MN+][],q[],top; int main()
{
n=read();f[][].init();
for(int i=;i<<<(<<)+;++i)
{
s[++tot]=i;top=;
for(int j=;j<=;++j)
{
int x=i>>(j<<);
if((x&)==) {top=-;break;}
if((x&)==) q[++top]=j;
if((x&)==)
{
if(!top) {top=-;break;}
else c[tot][q[top]]=j,c[tot][j]=q[top],--top;
}
}
if(top) --tot;
}
for(int i=;i<=n;++i)
{
for(int j=;j<=tot;++j)
{
if(s[j]&) f[][s[j]].init();
else f[][s[j]]=f[][s[j]>>];
}
for(int j=;j<=;++j)
{
int x=(j-)<<;
memset(f[j],,sizeof(f[j]));
for(int k=;k<=tot;++k)
{ int p=(s[k]>>x)&;
int q=(s[k]>>(x+))&;
if(!p&&!q) f[j][s[k]|(<<x)]+=f[j-][s[k]];
else if(p&&q)
{
if(p==&&q==)
{
if(i==n&&j==&&s[k]==(<<x)) ans+=f[j-][s[k]];
}
else if(p==&&q==)
f[j][s[k]^(<<x)^(<<(c[k][j]<<))]+=f[j-][s[k]];
else if(p==&&q==) f[j][s[k]^(<<x)]+=f[j-][s[k]];
else if(p==&&q==) f[j][s[k]^(<<x)^(<<(c[k][j-]<<))]+=f[j-][s[k]]; }
else
{
f[j][s[k]]+=f[j-][s[k]];
f[j][(s[k]^(p<<x)^(q<<x+))|(p<<x+)|(q<<x)]+=f[j-][s[k]];
}
}
}
}
ans+=ans;ans.print();
return ;
}

[usaco6.1.1Postal Vans]的更多相关文章

  1. DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构

    http://www.infoq.com/interviews/Technology-Influences-DDD# 要实现DDD(domain drive  design 领域驱动设计)原始意图,必 ...

  2. USACO 6.1 Postal Vans(一道神奇的dp)

    Postal Vans ACM South Pacific Region -- 2003 Tiring of their idyllic fields, the cows have moved to ...

  3. [外文理解] DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构。

    原文:http://www.infoq.com/interviews/Technology-Influences-DDD# 要实现DDD(domain drive  design 领域驱动设计)原始意 ...

  4. USACO6.5-Closed Fences:计算几何

    Closed Fences A closed fence in the plane is a set of non-crossing, connected line segments with N c ...

  5. USACO6.4-Wisconsin Squares:搜索

    Wisconsin Squares It's spring in Wisconsin and time to move the yearling calves to the yearling past ...

  6. USACO6.4-Electric Fences:计算几何

    Electric Fences Kolstad & Schrijvers Farmer John has decided to construct electric fences. He ha ...

  7. USACO6.4-The Primes

    The Primes IOI'94 In the square below, each row, each column and the two diagonals can be read as a ...

  8. usaco6.1-Cow XOR:trie树

    Cow XOR Adrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All o ...

  9. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

随机推荐

  1. python的Flask 介绍

    Flask 介绍 知识点 微框架.WSGI.模板引擎概念 使用 Flask 做 web 应用 模板的使用 根据 URL 返回特定网页 实验步骤 1. 什么是 Flask? Flask 是一个 web ...

  2. EasyUI中Tabs添加远程数据的方法。

    tabs加载远程数据: $(function () { $("#btnquery").click(function () { if (!$("#tcontent" ...

  3. eclipse maven项目目录

    今天遇见一个错误,关于eclipse项目的路径问题,web-inf的路径,上图和下图出现了两种web-INF,src的web-INFf和webContent的web-INF,src里面的文件需要编译以 ...

  4. 在thinkphp框架中使用后台传值过来的数组,在hightcart中使用数组

    js的数组是和php里面数组是不一样的,所以模板文件需要先接受,然后利用Js代码转化之后再使用,接受后台的数组有几种办法 1.后台传过来的json数组,利用Js是可以接受的,然后将json数据利用js ...

  5. Web移动端适配总结

    移动端适配的相关概念以及几种方案总结 适配相关概念 布局视口(layout viewport):html元素的上一级容器即顶级容器,用于解决页面在手机上显示的问题.大部分移动设备都将这个视口分辨率设置 ...

  6. Linux实战案例(4)CentOS清除用户登录记录和命令历史方法

    CentOS清除用户登录记录和命令历史方法 清除登陆系统成功的记录[root@localhost root]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信 ...

  7. 版本名称GA的含义:SNAPSHOT->alpha->beta->release->GA

    SNAPSHOT->alpha->beta->release->GA ----------------------------------------------------- ...

  8. 网络配置及shell基础

    一:集群已做完 二:临时配置网络(ip,网关,dns)+永久配置 临时配置网络: ip:    [root@localhost ~]# ifconfig [root@localhost ~]# ifc ...

  9. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  10. Hive:insert into table 与 insert overwrite table 区别

    创建测试表,来测试看看测试结果: create table test(name string,pwd string,createdate string)row format delimited fie ...