每种状态最多只有三种后继状态:中间往左跳,中间往右跳,两边往中间跳。

如果把它们分别看成左儿子、右儿子、父亲的话,那么会得到一些二叉树。

取出起始状态和终止状态往上跳$k$步的所有状态,其他状态我们只关心它们到关键状态的距离。

于是设$dp[i][j][k]$表示从起始状态跳了$i$步,目前位于状态$j$子树内距离$j$深度为$k$的状态的方案数,然后DP即可。

时间复杂度$O(k^3)$。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=110,P=1000000007;
struct E{
long long v[3];
void read(){
scanf("%lld%lld%lld",&v[0],&v[1],&v[2]);
sort(v,v+3);
}
E left(){
E b;
for(int i=0;i<3;i++)b.v[i]=v[i];
b.v[1]=b.v[0]*2-b.v[1];
swap(b.v[0],b.v[1]);
return b;
}
E right(){
E b;
for(int i=0;i<3;i++)b.v[i]=v[i];
b.v[1]=b.v[2]*2-b.v[1];
swap(b.v[1],b.v[2]);
return b;
}
bool can(){
return v[0]+v[2]!=v[1]*2;
}
E up(){
E b;
for(int i=0;i<3;i++)b.v[i]=v[i];
if(v[1]-v[0]<v[2]-v[1]){
b.v[0]=b.v[1]*2-b.v[0];
swap(b.v[0],b.v[1]);
}else{
b.v[2]=b.v[1]*2-b.v[2];
swap(b.v[1],b.v[2]);
}
return b;
}
bool operator==(const E&b){return v[0]==b.v[0]&&v[1]==b.v[1]&&v[2]==b.v[2];}
}S,T,now,a[N<<1];
int K,n,i,j,k,t,son[N<<1][2],f[N<<1],dp[N][N<<1][N];
inline void up(int&x,int y){x+=y;if(x>=P)x-=P;}
inline int id(E b){
for(int i=1;i<=n;i++)if(a[i]==b)return i;
return 0;
}
inline void push(E b){if(!id(b))a[++n]=b;}
int main(){
S.read();
T.read();
scanf("%d",&K);
for(push(now=S),i=1;i<=K;i++){
if(!now.can())break;
push(now=now.up());
}
for(push(now=T),i=1;i<=K;i++){
if(!now.can())break;
push(now=now.up());
}
for(i=1;i<=n;i++){
son[i][0]=id(a[i].left());
son[i][1]=id(a[i].right());
if(a[i].can())f[i]=id(a[i].up());
}
dp[0][id(S)][0]=1;
for(i=0;i<K;i++)for(j=1;j<=n;j++)for(k=0;k<=K;k++)if(dp[i][j][k]){
for(t=0;t<2;t++)if(k)up(dp[i+1][j][k+1],dp[i][j][k]);
else{
if(son[j][t])up(dp[i+1][son[j][t]][0],dp[i][j][k]);
else up(dp[i+1][j][1],dp[i][j][k]);
}
if(k)up(dp[i+1][j][k-1],dp[i][j][k]);
else if(f[j])up(dp[i+1][f[j]][0],dp[i][j][k]);
}
return printf("%d",dp[K][id(T)][0]),0;
}

  

BZOJ2454 : TopCoder SRM 463 RabbitPuzzle的更多相关文章

  1. TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E

    传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...

  2. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  3. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  4. TopCoder SRM 667 Div.2题解

    概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...

  5. Topcoder Srm 673 Div2 1000 BearPermutations2

    \(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...

  6. Topcoder Srm 671 Div2 1000 BearDestroysDiv2

    \(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...

  7. [topcoder]SRM 646 DIV 2

    第一题:K等于1或者2,非常简单.略.K更多的情况,http://www.cnblogs.com/lautsie/p/4242975.html,值得思考. 第二题:http://www.cnblogs ...

  8. [topcoder]SRM 633 DIV 2

    第一题,http://community.topcoder.com/stat?c=problem_statement&pm=13462&rd=16076 模拟就可以了. #includ ...

  9. TopCoder<SRM>上的一道1100分的题目解析附代码

    首先我们来简单看一下这道题的statement Problem Statement      Note that in the following problem statement, all quo ...

随机推荐

  1. epoll ET模式陷阱分析

    0. 前言 这篇文章主要记录在使用epoll实现NIO接入时所遇到的问题. 1. epoll简介 epoll是Linux下提供的NIO,其主要有两种模式,ET(Edge trige)和LT(Level ...

  2. memcached的key,value,过期时间的限制

    1.   key值最大长度? memcached的key的最大长度是250个字符,是memcached服务端的限制. 如果您使用的客户端支持"key的前缀"或类似特性,那么key( ...

  3. JQuery常用代码汇总

    获取<input />的value $("#id").val( ); 标签间的html $("#id").html('<tr><t ...

  4. R包igraph探究

    前段时候由于项目的原因,需要画图,然后开始接触R语言的igraph包,网上零零散散的搜罗了不少的信息,放在这边交流分享的同时也给自己留个备份吧~ 1.首先是读取文件,基本选用的都是csv文件 edge ...

  5. 微信小程序实质是什么? Hybrid App

    微信小程序是一种不需要下载安装即可使用的应用,用户扫一扫或者搜一下即可打开应用.微信小程序实质是Hybrid技术的应用.Hybrid App(混合模式移动应用). 小程序能够更多的可以更多的调用手机本 ...

  6. C/C++ 静态链接库(.a) 与 动态链接库(.so)

    平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的.但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了! 库有两种, ...

  7. MySQL关键字

    MySQL关键字 ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL ...

  8. 聊聊Azure的安全性

    本来没打算写这篇博文,毕竟感觉太理论化,不像做技术的人应该写的东西,但是作为一名售前,发现很多不了解Azure的客户,上来的第一个问题竟然就是Azure如何保证客户数据的安全性,我清楚记得我第一次被问 ...

  9. window共享linux下的文件 samba

    1.在Ubuntu上安装samba服务 sudo apt-get install samba 2.修改配置文件vim /etc/samba/smb.conf [xubu] (共享名) guest ac ...

  10. UVA2322

    题目:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...