[DP] HDU5819 Knights
来源:互联网 发布:linux源码编译mysql 编辑:程序博客网 时间:2024/05/21 14:47
Knights
题意:
t数轴上有n个骑士位于
思路:
如果第i个骑士开始往右走,显然有转移:
如果第i个骑士往左走,那就要考虑下了,容易想到的情况是i往左先杀掉几个,再被杀,那么可以写出转移
发现这个转移是对上一层
还有一种不容易想到的情况,就是i把左边的全部杀掉,在走到0转方向向右走,这种情况只存在于
同样利用求和的性质:
转移方程就写完了,剩下就是代码实现了。
最后答案就是最右的骑士杀掉左边的全部:
这个式子可以算答案了,但是利用求和的性质及
另外由于要取模,所以
完毕。
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 1e9+7;const int N = 1005;int n;ll dp[N][N];ll qpow(ll a, ll k){ ll res = 1; while(k){ if(k&1) res = (res*a)%mod; a = (a*a)%mod; k >>= 1; } return res;}int main(){ int T, ca = 1; ll qpow2 = qpow(2, mod-2); scanf("%d", &T); while(T--){ scanf("%d", &n); memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(int dir, i = 1; i <= n; ++i){ scanf("%d", &dir); if(i == 1) dir = 1; if(i == n) dir = 0; if(dir == 1){ for(int j = 1; j <= i; ++j) dp[i][j] = dp[i-1][j-1]; } else{ for(int j = i-1; j >= 2; --j){ dp[i][j] = (dp[i-1][j]*qpow2+dp[i][j+1]*qpow2)%mod; } dp[i][1] = (dp[i-1][1]+dp[i][2])%mod; } } printf("Case #%d: %lld\n", ca++, dp[n][1]*qpow2%mod); }}
0 0
- [DP] HDU5819 Knights
- 2016多校训练Contest7: 1011 Knights hdu5819
- Knights
- Knights
- sgu 225 Little Knights 状态压缩dp
- sgu225:Little Knights(状压DP+打表)
- hdu 5814 Knights ( dp状态设置)
- HDU 5819 Knights(概率DP)
- [HDU 5819] Knights (稍难的概率DP)
- GYM 100827 F.Knights(dp+矩阵快速幂)
- CodeForces 71 C.Round Table Knights(数论+dp)
- 【codeforces】gym 101137 K - Knights of the Old Republic【用最小生成树对图做集合dp】
- codeforces gym 2016-2017 NEERC, Moscow Subregional K. Knights of the Old Republic 最小生成树+dp
- CodeForce Round Table Knights
- UVa10422 - Knights in FEN
- Knights of Ni(bfs)
- 广搜:Knights Move
- 10422 - Knights in FEN
- Codevs 2776 寻找代表元(二分图匹配)
- Java多线程下模拟文件下载
- hdu 5213
- ebCTF bin200 Writeup
- 删除同文件夹下相同的文件(HashSet和file)
- [DP] HDU5819 Knights
- 设计模式总结之Interpreter Pattern(解释器模式)
- 设计模式-行为型-访问者模式(Visitor)
- Eclipse 4.6 Neon 的Tomcat插件安装方法
- POJ - 2488 A Knight's Journey
- python的一个对比
- zzuliOJ 1908:小火山的围棋梦想(DFS+小思维)
- UVALive 7327 Digit Division
- 我的ImageMagick使用心得