hdu 4576 (简单dp+滚动数组)
2013-08-14 15:38
330 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576
题意:给出1~n的环,m个操作,每次能顺时针或逆时针走w步,询问最后在l~r这段区间内概率。
(1<=n<=200) ,(0<=m<=1,000,000),(1<=l<=r<=n).
分析:每次从某一个数字到达另外数字的概率为0.5,按概率dp求出到达每个数字的概率,然后枚举从l到r的概率相加即可。
dp[i][j]表示第i次操作落在数字j上的概率,但是不能直接开1000000*200的数组来保存中间结果,这肯定是会爆掉的。
因为每次只需要取上一次的数据,所以可以用滚动数组,开dp[2][200]就行了
注意:w可能比n大,所以要先w%n
这一题卡时限卡的非常紧,代码稍微写挫一点就会超时了。
代码如下:
View Code
题意:给出1~n的环,m个操作,每次能顺时针或逆时针走w步,询问最后在l~r这段区间内概率。
(1<=n<=200) ,(0<=m<=1,000,000),(1<=l<=r<=n).
分析:每次从某一个数字到达另外数字的概率为0.5,按概率dp求出到达每个数字的概率,然后枚举从l到r的概率相加即可。
dp[i][j]表示第i次操作落在数字j上的概率,但是不能直接开1000000*200的数组来保存中间结果,这肯定是会爆掉的。
因为每次只需要取上一次的数据,所以可以用滚动数组,开dp[2][200]就行了
注意:w可能比n大,所以要先w%n
这一题卡时限卡的非常紧,代码稍微写挫一点就会超时了。
代码如下:
#include<stdio.h> #include<string.h> double dp[2][210]; int main() { int n,m,l,r,i,t,k,w; while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF) { if(n==0&&m==0&&l==0&&r==0) break; memset(dp,0,sizeof(dp)); dp[0][0]=1; t=0; while(m--) { scanf("%d",&w); w%=n; k=t^1; for(i=0;i<n;i++) dp[k][i]=0; for(i=0;i<n;i++) { if(!dp[t][i]) //时限卡的很紧,加这一句来优化,减少运算次数 continue; dp[k][(i+w)%n]+=0.5*dp[t][i]; dp[k][(i-w+n)%n]+=0.5*dp[t][i]; } t=k; } double ans=0; for(i=l;i<=r;i++) ans+=dp[t][i-1]; printf("%.4lf\n",ans); } return 0; }
View Code
相关文章推荐
- hdu 4576(概率dp+滚动数组)
- hdu 4576 Robot(dp+滚动数组)
- HDU 4576 (2013杭州邀请赛J题-dp滚动数组优化)
- HDU 4576(概率DP+滚动数组)
- [ACM] HDU 4576 Robot (概率DP,滚动数组)
- hdu 4576(概率dp+滚动数组)
- hdu 4576 概率dp+滚动数组
- hdu--4576--概率dp<见过最简单的概率dp>
- Hdu 5245 Joyful【滚动数组+概率Dp】
- HDU 1024 Max Sum Plus Plus (DP·滚动数组)
- hdu 1024 循环数组+简单dp
- 【hdu 1024】Max Sum Plus Plus —— dp && 滚动数组
- Robot HDU - 4576 dp+滚动数组
- bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组
- HDU - 2294 Pendant (DP滚动数组降维+矩阵高速功率)
- HDU 1024 Max Sum Plus Plus【DP+滚动数组】
- DP+滚动数组-HDU-1176-免费馅饼
- HDU--1421 -- 搬寝室 [DP] [滚动数组]
- HDU 1024 Max Sum Plus Plus(普通dp && 滚动数组优化)
- Monkey and Banana(HDU 1069)解题报告(DP - 滚动数组)