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 ...
随机推荐
- ArcGIS将Nodata区设置为0
两个栅格进行叠加,有时会有一部分没有数据,即用identify点击该区域,Value为NoData,而不是像其他非空区域一样有值.此时注意nodata区域要赋予0值,因为nodata+任何数=noda ...
- safari浏览器在window下 打开控制台
有时候需要在window下测试safari浏览器的兼容性 然后需要打开错误控制台 以下是完整打开的图文教程 1.显示菜单栏 2.打开偏好设置 3.然后切换到高级标签 勾选 在菜单栏显示开发菜单 4.打 ...
- Unity3D 之脚本架构,优雅地管理你的代码
本文参考雨松MOMO大神的帖子: 图片全部来自他的帖子(请允许我偷懒下) --------------------------------------------------------------- ...
- iPad版微信终于来临了 微信5.4版搜索更智能 转账就是发消息
等待甚久的iPad版微信终于来临了!昨日微信iOS版本更新至5.4.0.16,新增功能包括搜索公众号.识别图中二维码.面对面收钱,同时适配iPad.(微信5.4安卓版重回ios风格 导航菜单都放底栏位 ...
- Github.com上有哪些比较有趣的PHP项目?
链接就不贴了,可以在github上进行搜索.这里就不列举 symfony.laravel 这些大家都知道的项目了.只列举比较有意思的. swoole, C扩展实现的PHP异步并行网络通信框架,可以重新 ...
- redis中的key设置过期时间
EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的 ...
- 【Android学习】android布局中几个距离单位的区别:px、dp、sp
一.px 像素,我们经常说的400*800这种的就是像素,这个比较好理解. 二.dp 要理解dp,首先要先引入dpi这个概念,dpi全称是dots per inch,对角线每英寸的像素点的个数,所以, ...
- YII2 日志
YII 提供的日志写入方法: Yii::getLogger()->log($message, $level, $category = 'application') Yii::trace($mes ...
- orm 语法 数据库连接、建表、增删改查、回滚、单键关联 、多键关联、三表关联
1.数据库连接, #!usr/bin/env/python # -*- coding:utf-8 -*- # from wangteng import sqlalchemy from sqlalche ...
- JavaScript和JQuery好书推荐
其实无论你是php/python/java还是c/c++,只会自己那点知识是无法独立完成一个站点的建设的! 如果你因自己能力不足拒绝过几次亲友的建站请求,或者因合作中不了解前端是什么东西而失去过几次创 ...