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 ...
随机推荐
- js读书笔记
js读书笔记 基本类型的基本函数总结 1. Boolean() 数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 "&q ...
- ajax 提交表单文件上传
<form action="" method="post" enctype="multipart/form-data" id=&quo ...
- 处理 input 上传图片,浏览器读取图片大小过程中遇到到的坑(兼容IE8\9)
为了 解决这个坑~ 已经 累傻了.. 周末再 写吧..
- Android之layout_gravity与gravity解析
相信layout_gravity和gravity这两个属性一直困扰着很多人,很多初学者都分不清这两个属性有什么区别,以及怎样区分它们.它们中,有一个表示的是一个控件在父布局中的位置,而另一个表示的是一 ...
- C/C++的开发环境安装
sudo apt-get install gcc sudo apt-get install g++ sudo apt-get install cmake sudo apt-get install ma ...
- android:layout_height、android:layout_width、android:height、android:width的关系与区别
一直一来对android:layout_height.android:layout_width.android:height.android:width这几个属性的关系有些不理解,既然有了androi ...
- Java 网络编程之 Socket
========================UDP============================= UDP---用户数据报协议,是一个简单的面向数据报的运输层协议. UDP不提供可靠性, ...
- 在MVC中实现文件的上传
@using (Html.BeginForm("daoru", "Excel", FormMethod.Post, new { enctype = " ...
- SQL/T-SQL实例参考
,D.[Score] B_Score ,'Distince'= CASE WHEN C.Score > D.Score THEN C.[Score] - D.[Score] WHEN C.Sco ...
- mac mysql cmd
sudo /usr/local/mysql/support-files/mysql.server start sudo /usr/local/mysql/support-files/mysql.ser ...