HDU 4576(概率DP+滚动数组)
来源:互联网 发布:网络借贷监管法学 编辑:程序博客网 时间:2024/05/18 07:24
刚开始用搜索写着玩了玩,超时是必然,后来看题解可以才知道搜索到的当前深度所有点的可能性(即概率)是本层搜索中所有到达本点概率的和。所以用两个数组分别存上一次的概率和更新后的概率就好了。原来概率DP就是求概率,然后用动态规划推导,滚动数组就是不断的刷新一个数组,一个交换位置用,算是见识了。加油加油!
Description
Michael has a telecontrol robot. One day he put the robot on a loop with n cells. The cells are numbered from 1 to n clockwise.At first the robot is in cell 1. Then Michael uses a remote control to send m commands to the robot. A command will make the robot walk some distance. Unfortunately the direction part on the remote control is broken, so for every command the robot will chose a direction(clockwise or anticlockwise) randomly with equal possibility, and then walk w cells forward. Michael wants to know the possibility of the robot stopping in the cell that cell number >= l and <= r after m commands. Input
There are multiple test cases. Each test case contains several lines. The first line contains four integers: above mentioned n(1≤n≤200) ,m(0≤m≤1,000,000),l,r(1≤l≤r≤n). Then m lines follow, each representing a command. A command is a integer w(1≤w≤100) representing the cell length the robot will walk for this command. The input end with n=0,m=0,l=0,r=0. You should not process this test case.Output
For each test case in the input, you should output a line with the expected possibility. Output should be round to 4 digits after decimal points.Sample Input
3 1 1 215 2 4 4120 0 0 0Sample Output
0.50000.2500
#include <bits/stdc++.h>using namespace std;typedef pair<int, int> P;typedef long long LL;#define INF 0x3f3f3f3f#define PI acos(-1)#define MAX_N 10000//#define LOCALint n, m, l, r;double dp[2][205];int main(){#ifdef LOCALfreopen("b:\\data.in.txt", "r", stdin);#endif while(scanf("%d%d%d%d", &n, &m, &l, &r)) { if(!n && !m && !l && !r) break; memset(dp, 0, sizeof(dp)); dp[0][0] = 1; int t = 0, k;//滚动数组 for(int i = 0; i < m; i++) { int mov; scanf("%d", &mov); k = t^1; for(int c = 0; c < n; c++) dp[k][c] = 0; for(int j = 0; j < n; j++) { if(!dp[t][j]) continue; dp[k][(j+mov)%n] += dp[t][j]*0.5; dp[k][(j-mov+n)%n] += dp[t][j]*0.5; } t = k; }// for(int i = 0; i < n; i++)// cout << dp[t][i] << " " ;// cout << endl; double ans = 0; for(int i = l; i <= r; i++) ans += dp[t][i-1]; printf("%.4lf\n", ans); } return 0;}
0 0
- HDU 4576(概率DP+滚动数组)
- hdu 4576(概率dp+滚动数组)
- hdu 4576 概率dp+滚动数组
- [ACM] HDU 4576 Robot (概率DP,滚动数组)
- Hdu 5245 Joyful【滚动数组+概率Dp】
- POJ3071-Football(概率DP+滚动数组)
- hdu 4576 Robot(dp+滚动数组)
- hdu 4576(概率dp)
- hdu 4576 D - Robot dp+滚动数组
- hdu 3392(滚动数组优化dp)
- hdu 4576 概率dp
- hdu 1513(dp+滚动数组)
- hdu 1024 dp滚动数组
- HDU 1024(DP+滚动数组)
- HDU 4576 Robot (概率dp)
- HDU 4576 Robot (概率DP)
- HDU 4576 Robot(概率dp)
- [HDU 4576]Robot[概率DP]
- 函数指针
- 面试题61:按之字形顺序打印二叉树
- 需求分析方法及包装类
- 关于listview,gridview里面数据显示不全的问题
- 二维码
- HDU 4576(概率DP+滚动数组)
- C#使用Unity框架
- pyqt 修改line Edit的背景颜色
- c++ fstream中seekg()和seekp()的用法
- 十、外观模式Facade(结构型)
- POJ-2007 Scrambled Polygon(计算几何)
- JDK源码学习(1)-HashMap源码分析,HashMap与HashTable的差别
- 进程间通信——mmap()函数
- [HDU5739] Fantasia [2016 Multi-University Training Contest 2(多校联合训练2) F]