BZOJ2454 : TopCoder SRM 463 RabbitPuzzle
每种状态最多只有三种后继状态:中间往左跳,中间往右跳,两边往中间跳。
如果把它们分别看成左儿子、右儿子、父亲的话,那么会得到一些二叉树。
取出起始状态和终止状态往上跳$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的更多相关文章
- TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E
传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- TopCoder SRM 667 Div.2题解
概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...
- Topcoder Srm 673 Div2 1000 BearPermutations2
\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...
- Topcoder Srm 671 Div2 1000 BearDestroysDiv2
\(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...
- [topcoder]SRM 646 DIV 2
第一题:K等于1或者2,非常简单.略.K更多的情况,http://www.cnblogs.com/lautsie/p/4242975.html,值得思考. 第二题:http://www.cnblogs ...
- [topcoder]SRM 633 DIV 2
第一题,http://community.topcoder.com/stat?c=problem_statement&pm=13462&rd=16076 模拟就可以了. #includ ...
- TopCoder<SRM>上的一道1100分的题目解析附代码
首先我们来简单看一下这道题的statement Problem Statement Note that in the following problem statement, all quo ...
随机推荐
- 如何学习Oracle
如何学习Oracle?分清几个概念是关键 经常有一些Oracle的初学者问到以下几个问题,这里集中解答一下,希望对大家有帮助. 1.如果有一定的数据库基础,知道SQL是怎么回事,即使写不出 ...
- 20145204&20145212信息安全系统实验三报告
实时系统的移植 实验目的与要求 1.根据实验指导书进行实时软件的安装 2.配置实验环境,并对软件进行测试. 3.正确使用连接线等仪器,注意保护试验箱. 实验内容与步骤 1.连接 arm 开发板 连接实 ...
- 笔记:MAC OS X下配置PHP开发、调试环境
操作系统:MAC OS X 工具:MAMP.PhpStorm.xdebug.chrome 1.下载MAMP 2.安装比较简单,安装完成后,应用程序中会增加如下4个应用 MacGDBp是PHP调试器,使 ...
- Gdb调试多进程程序
Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办 ...
- wdcp安装memcached解决办法
1.下载libevent-1.4.14b-stable.tar.gz和memcached-1.4.15.tar.gz这两个文件,上传到服务器,并给它一个可用的下载地址, 如http://地址/memc ...
- js parseInt 显示0
parseInt 有第二个参数, 就是进制参数 parseInt("08", 10); //表示这个数字是十进制的就不会出错了.
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- XCTest各种断言
XCTFail(format…) 生成一个失败的测试: XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过: XCTAssertNotNil(a1, forma ...
- 配置nginx+php
一般这样配置 此时很多教程会教大家这样配置Nginx+PHP: server { listen 80; server_name foo.com; root /path; location / { in ...
- Python:Pycharm下无法导入安装好的第三方模块?
Pycharm下无法导入安装好的第三方模块requests? 在cmd下使用pip安装好requests模块后,可以使用import requests,但在Pycharm IDE下无法导入,出现如下错 ...