ZOJ 3640 Help Me Escape (概率DP)
2015-07-12 00:18
423 查看
题意很好理解,略去不说了。
思路:设dp[i]为战斗力为i时走出洞穴的期望。
先对c[]从小到大排序。
再二分查找c>=i的位置。
那么期望逆推得 dp[i] = (t1 + t2 + ......tk-1 + dp[i+ck] + 1 + ..... dp[i+cn] + 1) / n。
我的代码:
思路:设dp[i]为战斗力为i时走出洞穴的期望。
先对c[]从小到大排序。
再二分查找c>=i的位置。
那么期望逆推得 dp[i] = (t1 + t2 + ......tk-1 + dp[i+ck] + 1 + ..... dp[i+cn] + 1) / n。
我的代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> using namespace std; const int MAX = 20005; const int maxn = 105; double dp[MAX]; int n,f,c[maxn],t[maxn]; int calc(int x){ return (int)floor((1.0 + sqrt(5.0))*x*x / 2.0); } void solve(){ memset(dp,0,sizeof(dp)); for(int i = MAX - 1 ; i >= f ; i--){ int k = lower_bound(c,c+n,i) - c; for(int j = 0 ; j < k ; j++) dp[i] += 1.0 * t[j] / n; for(int j = k ; j < n ; j++) dp[i] += 1.0 * (dp[i + c[j]] + 1) / n; } //for(int i = 1 ; i < 10 ; i++) cout<<dp[i]<<endl; printf("%.3f\n",dp[f]); } int main(){ while(~scanf("%d%d",&n,&f)){ for(int i = 0 ; i < n ; i++) scanf("%d",&c[i]); sort(c,c+n); for(int i = 0 ; i < n ; i++) t[i] = calc(c[i]); solve(); } return 0; }
相关文章推荐
- 【C++基础】——拷贝构造函数的浅拷贝和深拷贝
- HTML5
- 国嵌驱动专题四网卡
- Android开源汇总
- SVN的trunk、branches、tags
- Android 输入管理服务启动过程的流程
- codeforces 535B-Tavas and SaDDas
- Linux-----Ubuntu中apt-get安装源的设置
- 近期任务安排
- Unfinished List
- 跟我一起写 Makefile(一)
- HDU--5280(dp或枚举)
- 散列表之开放定址法
- Javascript数据类型转换规则
- FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(
- 简单的linux命令笔记
- Linux 系统扫描技术及安全防范 之 nmap(批量主机服务扫描命令)
- 安装MySQL最后一步出现错误Error Nr.1045解决方法
- APM系列-国外新兴厂商New Relic vs. AppDynamics
- HDU 1166 敌兵布阵