hdu4576

发布 : 2020-05-19 分类 : 动态规划 浏览 :

题目

一个圆盘,有n个编号(1,2,3……n),从1出发,每次能逆时针或顺时针走w步,问经过m次后,最终停留在区间[l,r]的概率。

解析

首先,取模运算是一定要把1到n换成0到n-1;其次,利用temp来进行奇偶变换。

引用自博客:

https://www.cnblogs.com/kevinACMer/p/3723531.html

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define maxn 1000005
int n, m, l, r;
double dp[205][2];
int w[maxn];
int main(){
while(scanf("%d%d%d%d", &n, &m, &l, &r) && (n || m || l || r)){
for(int i = 0; i < m; ++i) scanf("%d", &w[i]);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
int cur = 0;
for(int j = 0; j < m; ++j){
int t = w[j] % n;
cur ^= 1;
for(int i = 0; i < n; ++i)
dp[i][cur] = 0.5 * dp[(i + t) % n][cur ^ 1] + 0.5 * dp[(i - t) % n][cur ^ 1];
}
double ans = 0;
for(int i = l - 1; i < r; ++i) ans += dp[i][cur];
printf("%.4lf\n", ans);
}
return 0;
}
本文作者 : preccrep
原文链接 : https://preccrep.github.io/2020/05/19/hdu4576/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹

博客已萌萌哒运行(●'◡'●)ノ♥
Theme - BMW | Made With 💗 | Powered by GodBMW