来自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. 从PRISM开始学WPF(二)Prism?

    目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Modu ...

  2. Windows 的Apache支持SSI配置

    配置SSI什么是shtml? 使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为"服务器端嵌入"或 ...

  3. B+树介绍

    B+树 B+树和二叉树.平衡二叉树一样,都是经典的数据结构.B+树由B树和索引顺序访问方法(ISAM,是不是很熟悉?对,这也是MyISAM引擎最初参考的数据结构)演化而来,但是在实际使用过程中几乎已经 ...

  4. Python内置函数(60)——compile

    英文文档: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) Compile the source i ...

  5. AutoCAD中的扩展字典及扩展记录(C#)

    在学习CAD扩展记录的过程中,遇到了一些问题,也积累了一些经验,现在给大家分享一些我的学习心得.在学习扩展字典之前需要读者了解cad的组码,也就是DxfCode.感兴趣的也可以了解一下扩展数据的相关内 ...

  6. GIT入门笔记(19)GIT 小结

    1.add和commit为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:$ git add file1.txt$ g ...

  7. DevExpress 控件中GridControl的使用

    近期开发用到了DevExpress系列的控件,GridControl是我用到的Dev系列控件最多的一个控件.现在先来总结一下: 首先先写一个简单的小例子来简单介绍一下GridControl的用法: 1 ...

  8. RxJava系列7(最佳实践)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  9. Java 微服务框架选型(Dubbo 和 Spring Cloud?)

    微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任 ...

  10. 小技巧-C#文本快速删除空行

    查找:^\s*\n 替换空格 选择正则表达式