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常用几种本地数据AE初始化
1.Personal GDB 新建一个在E盘的名为test的mdb: IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryCl ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- C#成员函数直接调用和反射+委托的性能比较
using System; using System.Reflection; using System.Diagnostics; namespace Refl { class Test { publi ...
- QT中将ASCII转换为对应数值的方法
有时候需要将一段ASCII转换为数值进行传输(比如串口) QString str=codeEdit->toPlainText(); QVector<uint>v=str.toUcs4 ...
- 用 const 还是用 let?
ES6 里新增了两种声明变量的方式,let 和 const,加上原来的 var,一共就有三种方式来声明变量了.那到底该用哪个呢?关于“尽可能不用 var” 这一点,大家应该没有什么意见分歧(其实还是有 ...
- Silicon C8051F340之时钟系统
一.背景 做个记录,以备下次快速开发. 二.正文 C8051F340有一个可编程内部高频振荡器.一个可编程内部低频振荡器.一个外部振荡器驱动电路 和一个4倍时钟乘法器.其中可编程内部高频振荡器在系统复 ...
- 如何在网页中嵌套其他的HTML文件
html文件引入其它html文件的方法有三种,具体可以看下:1.IFrame引入,看看下面的代码 <IFRAME NAME="content_frame" width=100 ...
- $.prop()和$.attr() 区别用法
都用于读取和设置DOM元素节点的属性 不同: $.attr()用于DOM元素本身的属性 $.prop()用于DOM节点对应的JS属性(源于DOM元素到JS对象的映射) 源于两者在jquery类库的实现 ...
- LINUX DNS解析的3种修改方法~
1.HOST 本地DNS解析 vi /etc/hosts 添加规则 例如: 223.231.234.33 www.baidu.com 2.网卡配置文件DNS服务地址 vi /etc/sysconfi ...
- div内填内容
<div contenteditable="true">可以编辑里面的内容</div> 这样就可以使div想textarea一样 可以加入自动换行与over ...