您的位置:首页 > 其它

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

2014-10-26 21:54 197 查看
看到 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 真烦..

#include <iostream>
#include <iomanip>
using namespace std;

const int size = 210;
double dp[2][size];

int main( )
{
cin.sync_with_stdio(false);
int n , m , L , R , k , x , y , w;
double ans;
while( cin >> n >> m >> L >> R && ( n || m || L || R ) )
{
k = 1;
for( int i = 0 ; i<=n ; i++ )
{
dp[0][i] = dp[1][i] = 0.0;
}
dp[0][0] = 1.0;
for( int i = 0 ; i<m ; i++ )
{
cin >> w;
for( int j = 0 ; j<n ; j++ )
{
if( dp[!k][j] )
{
dp[k][(j+w)%n] += dp[!k][j] * 0.5;
dp[k][(j-w+n)%n] += dp[!k][j] * 0.5;
}
dp[!k][j] = 0;
}
k = !k;
}
ans = 0;
for( int i = L-1 ; i<=R-1 ; i++ )
{
ans += dp[ m&1 ][i];
}
cout << setiosflags(ios::fixed);
cout << setprecision(4) << ans << endl;
}
return 0;
}


View Code

today:

   昨天

   你说

   明天

   岁就就是如此这般地被我们蹉跎了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: