[HDU 5819] Knights (稍难的概率DP)
来源:互联网 发布:sql server和mysql区别 编辑:程序博客网 时间:2024/05/17 02:39
HDU - 5819
棋盘上有
N 个骑士,他们要么向左走,要么向右走
他们相遇时会发生决斗,每个人都有12 的概率获胜
胜者继续前进,败者直接退出游戏,骑士走到棋盘边缘会回头
问第N 个骑士获胜的概率
看了题解的状态,感觉太神了……
首先第一个骑士肯定向右,第
第
设
- 如果第
i 个骑士向右走,那么dp[i][j]=dp[i−1][j−1] - 如果第
i 个骑士向左走,那么dp[i][j]=∑k=ji−1dp[i−1][k]×(12)k−j+1
即原本有k 个骑士向左走,第i 个骑士阻挠了k−j 个,并且最后失败的概率
这个转移方程还需要优化一下,由于是个类似等比数列的形式
所以dp[i][j]=dp[i][j+1]+dp[i−1][j]2
还有一种情况是,第i 个骑士向左走的时候,
打败了左边所有的骑士,最后改变方向向右走dp[i][1]+=∑k=1i−1dp[i−1][k]×(12)k
最后的答案即为
由于优化了转移方程,所以总的时间复杂度是
#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <cctype>#include <map>#include <set>#include <queue>#include <bitset>#include <string>using namespace std;typedef pair<int,int> Pii;typedef long long LL;typedef unsigned long long ULL;typedef double DBL;typedef long double LDBL;#define MST(a,b) memset(a,b,sizeof(a))#define CLR(a) MST(a,0)#define SQR(a) ((a)*(a))#define PCUT puts("\n----------")const int maxn=1e3+10, inv2=500000004, MOD=1e9+7;int N;int A[maxn];LL dp[2][maxn];int main(){ #ifdef LOCAL freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout); #endif int T; scanf("%d", &T); for(int ck=1; ck<=T; ck++) { scanf("%d", &N); for(int i=1; i<=N; i++) scanf("%d", &A[i]); A[N]=0; CLR(dp); dp[1][1] = 1; for(int i=2, cur, las; i<=N; i++) { cur=i&1, las=(i-1)&1; CLR(dp[cur]); if(A[i]) for(int j=2; j<=i; j++) dp[cur][j] = dp[las][j-1]; else { for(int j=i-1; j>=1; j--) { dp[cur][j] = (dp[cur][j+1] + dp[las][j])%MOD *inv2%MOD; } LL prod = inv2; for(int j=1; j<=i-1; j++) { dp[cur][1] = (dp[cur][1] + dp[las][j]*prod%MOD)%MOD; prod = prod*inv2%MOD; } } } LL ans = dp[N&1][1]*inv2%MOD; printf("Case #%d: %lld\n", ck, ans); } return 0;}
0 0
- [HDU 5819] Knights (稍难的概率DP)
- HDU 5819 Knights(概率DP)
- hdu 5814 Knights ( dp状态设置)
- 【概率DP】hdu 5819
- hdu 4652(概率dp)
- HDU Walk (概率DP)
- HDU 4987(概率dp)
- HDU 4405(概率dp)
- hdu 3583(概率dp)
- hdu 4576(概率dp)
- Hdu 5819 Knights ★
- HDU 4326Game(比较难理解的概率dp)
- hdu 4035 Maze (树上的概率dp)
- HDU 4546简单的概率 dp
- hdu-4035-Maze-树上的概率dp
- HDU 4035 Maze (很好的概率DP)
- hdu - 4649 - Professor Tian(概率dp)
- hdu 4405 Aeroplane chess(概率dp)
- 在Mac上安装配置OpenFire过程
- Java泛型中的PECS原则
- kafkaSpout工作流程简介
- 【zzuliOJ】1909 - 小火山的友情距离(数学)
- Android酷炫实用的开源框架(UI框架)
- [HDU 5819] Knights (稍难的概率DP)
- Android编程之fill_parent、wrap_content和match_parent的区别
- 树状数组---逆序类题目
- maven package用法 打包maven项目
- 树状数组题目---HDU 1541 stars 及其变形(降维思想)
- iOS coreBluetooth编程中需要注意的问题
- 神奇的备忘录
- Python读取某个目录下的zip压缩包解压开后计算每个小文件的md5值,并将压缩包名字、里面小文件名字、以及对应的md5值写入csv文件
- Android 如何让EditText不自动获取焦点