hdu 4576 (简单dp+滚动数组)

题目链接: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
这一题卡时限卡的非常紧,代码稍微写挫一点就会超时了。
代码如下:

复制代码
 1 #include<stdio.h>
 2 #include<string.h>
 3 double dp[2][210];
 4 int main()
 5 {
 6     int n,m,l,r,i,t,k,w;
 7     while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF)
 8     {
 9         if(n==0&&m==0&&l==0&&r==0)
10             break;
11         memset(dp,0,sizeof(dp));
12         dp[0][0]=1;
13         t=0;
14         while(m--)
15         {
16             scanf("%d",&w);
17             w%=n;
18             k=t^1;
19             for(i=0;i<n;i++)
20                 dp[k][i]=0;
21             for(i=0;i<n;i++)
22             {
23                 if(!dp[t][i])   //时限卡的很紧,加这一句来优化,减少运算次数
24                     continue;
25                 dp[k][(i+w)%n]+=0.5*dp[t][i];
26                 dp[k][(i-w+n)%n]+=0.5*dp[t][i];
27             }
28             t=k;
29         }
30         double ans=0;
31         for(i=l;i<=r;i++)
32             ans+=dp[t][i-1];
33         printf("%.4lf\n",ans);
34     }
35     return 0;
36 }
View Code
复制代码

 

posted on   jumpingfrog0  阅读(646)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
历史上的今天:
2012-08-14 强连通分量 POJ 2375 Cow Ski Area
< 2025年3月 >
23 24 25 26 27 28 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 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示