UVA 13184 期望DP
2016-01-17 16:38
183 查看
UVA 13184
题目链接:
http://www.bnuoj.com/v3/problem_show.php?pid=13184
题意:
n只老虎m匹麋鹿还有你自己。
每天任意的选择两个动物相遇,然后题目给出了相遇时会发生的情况。
问你活下来的概率。
思路:
看了别人代码,发现自己写的并没有问题,只是求组合数时求错了~
Dp[i][j]表示还剩i只老虎和j只麋鹿,自己活下去的概率。
然后就是正常的数学期望DP了。
根据题意分了自己遇到麋鹿时杀和不杀、然后取最大的一个。然后通过别人代码发现不用讨论,肯定是不杀的存活率大。
源码:
题目链接:
http://www.bnuoj.com/v3/problem_show.php?pid=13184
题意:
n只老虎m匹麋鹿还有你自己。
每天任意的选择两个动物相遇,然后题目给出了相遇时会发生的情况。
问你活下来的概率。
思路:
看了别人代码,发现自己写的并没有问题,只是求组合数时求错了~
Dp[i][j]表示还剩i只老虎和j只麋鹿,自己活下去的概率。
然后就是正常的数学期望DP了。
根据题意分了自己遇到麋鹿时杀和不杀、然后取最大的一个。然后通过别人代码发现不用讨论,肯定是不杀的存活率大。
源码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <string> #include <algorithm> #include <iostream> using namespace std; const int MAXN = 1000 + 5; double dp[MAXN][MAXN]; double sum[MAXN][MAXN]; int vis[MAXN][MAXN]; double calC1(int x, int a) { double t1 = x; if(a == 2) t1 = t1 * (t1 - 1) / 2; return t1; } double calC2(int x, int a, int y, int b) { double t1 = x; if(a == 2) t1 = t1 * (x - 1) / 2; double t2 = y; if(b == 2) t2 = t2 * (y - 1) / 2; return 1.0 * t1 * t2; } double dfs(int n, int m) { if(n == 0) return 1; if(vis [m]) return dp [m]; dp [m] = 0; double temp = 0; if(n >= 2) temp += dfs(n - 2, m) * calC1(n, 2); if(m >= 1) temp += dfs(n, m - 1) * calC2(n, 1, m, 1); // if(n >= 1) temp -= dfs(n - 1, m) * calC1(n, 1); double ttemp = m >= 2 ? calC1(m, 2) : 0; double ans1 = temp / (calC1(n + m + 1, 2) - m - ttemp); double ans2 = m >= 1 ? (temp + dfs(n, m - 1) * m) / (calC1(n + m + 1, 2) - ttemp) : 0; dp [m] = max(ans1, ans2); // dp[n][m] = min(dp[n][m], 1.0); // dp[n][m] = temp / (calC1(n + m + 1, 2) - calC1(m, 2) - m); vis [m] = 1; // printf("n = %d, m = %d, dp[n][m] = %f\n", n, m, dp[n][m]); return dp [m]; } void init() { memset(vis, 0, sizeof(vis)); dfs(1000, 1000); } int main() { init(); int T; scanf("%d", &T); for(int cas = 1 ; cas <= T ; cas++){ int n, m; double ans; scanf("%d%d", &n, &m); // memset(dp, 0, sizeof(dp)); if(n % 2 == 1) ans = 0; else ans = dfs(n, m); printf("Case %d: %.10f\n", cas, ans); } return 0; }
相关文章推荐
- PSK星座对象(constellation.cc)
- Android中删除Preference详解
- linux习惯每天一个命令之ps
- code vs 最大全0子矩阵
- C语言栈
- iOS App名称以及内容简繁体适配
- 斯坦福公开课:Developing IOS 8 App with Swift(1-3)心得体会
- VS按键响应
- CSS 垂直居中设置
- 浅谈用极大化思想解决最大子矩阵问题
- iReport与JasperReport PDF中文解决
- K近邻分类算法
- rqnoj 1 去重+排序
- NSRunloop
- Sublime快捷键
- Android 获取来电号码 + 悬浮框
- 给自己的一些提醒
- gitbub for windows 环境搭建与代码同步
- 高性能JavaScript
- xcode 左边导航栏中,类文件后面的标记字母的意义