uva 1456 dp 求期望
来源:互联网 发布:oracle sql优化 编辑:程序博客网 时间:2024/05/01 17:34
UVA 1456 - Cellular Network
大致意思可以理解为有n个盒子,盒子里面放球的概率为p[i],把这n个盒子分成k组,按顺序打开每组的盒子。求打开盒子找到球的需要拆盒子数的期望。
按概率从大道小排序,贪心选择概率大的盒子先拆,然后维护概率的前缀和。
dp[i][j]表示前i个盒子被分成j组的找到小球的期望。
大致意思可以理解为有n个盒子,盒子里面放球的概率为p[i],把这n个盒子分成k组,按顺序打开每组的盒子。求打开盒子找到球的需要拆盒子数的期望。
按概率从大道小排序,贪心选择概率大的盒子先拆,然后维护概率的前缀和。
dp[i][j]表示前i个盒子被分成j组的找到小球的期望。
dp[i][j] = min{dp[k][j-1] + (p[i] - p[k]) * i};
#include <bits/stdc++.h>using namespace std;const int INF = 999999999;int n, m;int a[105];double p[105];double dp[105][105];int _sum;bool cmp (double a, double b) {return a > b;} int main () {int T;for (scanf ("%d", &T); T>0; --T) {scanf("%d%d", &n, &m);_sum = 0;for (int i=1; i<=n; i++) {scanf ("%d", &a[i]);_sum += a[i];}for (int i=1; i<=n; i++) {p[i] = 1.0 * a[i] / _sum;}sort(p+1, p+n+1, cmp);for (int i=1; i<=n; i++) {p[i] += p[i-1];}dp[1][1] = p[1] * 1.0;for (int i=2; i<=n; i++) {dp[i][1] = p[i] * i; for (int j=2; j<=min(i, m); j++) {dp[i][j] = INF * 1.0;for (int k=j-1; k<i; k++) {dp[i][j] = min(dp[i][j], dp[k][j-1] + 1.0 * (p[i] - p[k]) * i);}}}printf("%.4lf\n", dp[n][m]);}return 0;}
0 0
- uva 1456 dp 求期望
- uva 11427 Expect the Expected 概率dp求期望
- UVA 10529 Dumb Bones 概率dp 求期望
- Uva 11427 Expect the Expected 概率dp 求数学期望
- uva 11600(期望dp)
- UVA 13184 期望DP
- 概率dp 求期望
- UVA 11762 概率dp+期望
- Poj 2096 (dp求期望)
- Zoj 3329 (dp求期望)
- 树形dp 求期望 HDU4035
- zoj 3551 dp求期望
- poj 2096 dp 求 期望
- zoj 3329 DP 求期望
- zoj 3582 DP 求期望
- BNU29034 求期望的dp
- HDU4405(概率DP求期望)
- hdu4336(状压dp求期望)
- 分析堆栈及_INTSIZEOF/va_list/va_start/va_arg/va_end
- 欢迎使用CSDN-markdown编辑器
- Netty LengthFieldBasedFrameDecoder
- UVa 227 - Puzzle
- Leetcode: Binary Tree Paths
- uva 1456 dp 求期望
- 复制一个Dialog后DoModal()返回-1
- 常量指针与指针常量
- Leetcode -- Insertion Sort List
- hdu 1061Rightmost Digit 模幂运算
- Linux下的调试工具
- 104Maximum Depth of Binary Tree
- 求最小的k个数
- hdu 5131 Song Jiang's rank list(模拟)