hdu--4576--概率dp<见过最简单的概率dp>

看到 expected possibility 一下子 又觉得是概率dp了..

这题 也的确是了

但做的狠无语啊  尝试了2种  一个是TLE 一个是AC 但也要花掉了3000多ms。。

而且 我也觉得这两种 区别不大啊 思想是一样的 就是处理上有点区别..

应该是第二种TLE的故意被卡了时间吧  my guess

这题的话 思路很简单 就是一层一层的递推下来 并且这一层的状态只与上一层有关~

其实 每次可以选择走的方案数就是: 2^1 --> 2^2 --> 2^3 --> ......->2^m

不用管2^m的值会很大 因为一共只有200个格子   n<=200 那么我只要遍历n就够了

求大神 帮我纠错 第一份代码 =_=

刚开始用了set来处理 严重tle 真烦..

 1 #include <iostream>
 2 #include <iomanip>
 3 using namespace std;
 4
 5 const int size = 210;
 6 double dp[2][size];
 7
 8 int main( )
 9 {
10     cin.sync_with_stdio(false);
11     int n , m , L , R , k , x , y , w;
12     double ans;
13     while( cin >> n >> m >> L >> R && ( n || m || L || R ) )
14     {
15         k = 0;
16         for( int i = 0 ; i<=n ; i++ )
17         {
18             dp[0][i] = dp[1][i] = 0.0;
19         }
20         for( int i = 0 ; i<m ; i++ )
21         {
22             cin >> w;
23             if( !i )
24             {
25                 x = (1+w-1)%n + 1;
26                 y = (1+n-w)%n;
27                 y = (y==0) ? n : y;
28                 dp[k][x] = 0.5;
29                 dp[k][y] = 0.5;
30                 //cout << x << " " << y << endl;
31             }
32             else
33             {
34                 for( int j = 1 ; j<=n ; j++ )
35                 {
36                     if( dp[k][j] )
37                     {
38                         x = (j+w-1)%n+1;
39                         y = (j+n-w)%n;
40                         y = (y==0) ? n : y;
41                         dp[!k][x] += dp[k][j] * 0.5;
42                         dp[!k][y] += dp[k][j] * 0.5;
43                         //cout << x << " " << y << endl;
44                     }
45                     dp[k][j] = 0;
46                 }
47                 k = !k;
48             }
49         }
50         ans = 0;
51         for( int i = L ; i<=R ; i++ )
52         {
53             ans += dp[(m+1)&1 ][i];
54             //cout << dp[(m+1)&1][i] << endl;
55         }
56         cout << setiosflags(ios::fixed);
57         cout << setprecision(4) << ans << endl;
58     }
59     return 0;
60 }
61 /*
62 4 3 1 2
63 1
64 2
65 3
66 */

 1 #include <iostream>
 2 #include <iomanip>
 3 using namespace std;
 4
 5 const int size = 210;
 6 double dp[2][size];
 7
 8 int main( )
 9 {
10     cin.sync_with_stdio(false);
11     int n , m , L , R , k , x , y , w;
12     double ans;
13     while( cin >> n >> m >> L >> R && ( n || m || L || R ) )
14     {
15         k = 1;
16         for( int i = 0 ; i<=n ; i++ )
17         {
18             dp[0][i] = dp[1][i] = 0.0;
19         }
20         dp[0][0] = 1.0;
21         for( int i = 0 ; i<m ; i++ )
22         {
23             cin >> w;
24             for( int j = 0 ; j<n ; j++ )
25             {
26                 if( dp[!k][j] )
27                 {
28                     dp[k][(j+w)%n] += dp[!k][j] * 0.5;
29                     dp[k][(j-w+n)%n] += dp[!k][j] * 0.5;
30                 }
31                 dp[!k][j] = 0;
32             }
33             k = !k;
34         }
35         ans = 0;
36         for( int i = L-1 ; i<=R-1 ; i++ )
37         {
38             ans += dp[ m&1 ][i];
39         }
40         cout << setiosflags(ios::fixed);
41         cout << setprecision(4) << ans << endl;
42     }
43     return 0;
44 }

today:

   昨天

   你说

   明天

   岁就就是如此这般地被我们蹉跎了

时间: 2024-10-13 01:48:25

hdu--4576--概率dp<见过最简单的概率dp>的相关文章

[ACM] HDU 4576 Robot (概率DP,滚动数组)

Robot Problem 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 ro

HDU 4576 Robot (概率DP)

题意: 思路: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; double dp[3][300]; int main() { int n,m; int l,r; int i,j,k; double ans; int temp,now; while(scanf("%d%d%d%d",&n,&

HDU 4576 Robot(概率题)

Robot Problem 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 ro

2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到100即可 算最大GPA的时候,首先每个科目分配到60分,然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到85即可,如果还有REMAIN POINT,就FOR循环下来加到100上限即可 不会DP 阿 QAQ 过段时间得好好看DP了  =  = 于是默默的把这题标记为<水题集> //

hdu 1024 Max Sum Plus Plus(简单dp)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意:给定一个数组,求其分成m个不相交子段和的最大值. 这题有点问题其实m挺小的但题目并没有给出. dp[i][j]表示取第i 位的数共取了j段然后转移方程显然为 dp[i][j]=max(dp[i - 1][j]+a[j] , max(dp[j - 1][j - 1]~dp[i - 1][j - 1]))(大致意思是取第i位要么i-1位取了j个那么a[j]刚好能与i-1拼成一段,或者j -

HDU 5074 Hatsune Miku(简单二维dp)

题目大意:给你一些音符之间的联系,给你一个串,让你求出这个串的最大值.-1的时候可以任意替代,其他情况必须为序列上的数. 解题思路:简单二维dp,分情况处理就可以了啊. Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 637    Accepted Submission(s): 458 Problem De

HDU 4800 &amp; ZJU 3735 Josephina and RPG(状压dp)

题目链接: ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5081 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and sometimes roleplaying game) is a game in which players assume the roles of c

HDU 1565&amp;1569 方格取数系列(状压DP或者最大流)

方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6206    Accepted Submission(s): 1975 Problem Description 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的

HDU 3853 向下向右找出口问题-期望dp

题意:初始状态在(1,1)的位置,目标是走到(n,n),每次只能向下向右或者不移动,已知在每个格子时这三种情况的概率,每移动一步消耗2的魔力,求走到终点的使用的魔力的期望. 分析:简单的期望dp,套用之前的框架,但是这题不是+1,而是+2,因为每次多加的那个数字是走一步的消耗,这里是2!注意p1[i][j]==1时不能计算dp[i][j],看式子就知道了,分母不能为0. 代码: #include<iostream> #include<cstdio> using namespace