UVA - 1456(cellular network 概率dp)
2014-12-22 12:18
489 查看
首先,要把概率从小到大排序,原因很简单,在期望表达式中同样的决策方案人数越多的项占有的比重越小越好;
然后直接dp即可;d[ i ][ j ] 代表到i位置已经分了几组剩下分配的最大期望;
然后直接dp即可;d[ i ][ j ] 代表到i位置已经分了几组剩下分配的最大期望;
#include <cstdio> #include <map> #include <cmath> #include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int inf = 1000; const int maxn = 105; double d[maxn][maxn],w[maxn],sum[maxn]; bool vis[maxn][maxn]; int n,m; double Sum(int x,int y){ return w[y]-w[x-1];} double dp(int i,int j){ if(vis[i][j]) return d[i][j]; vis[i][j] = true; if(i==n&&j<m) return d[i][j]=inf; if(j==m-1){ return d[i][j] = n*Sum(i+1,n); } d[i][j]=inf; for(int k=i+1;k<=n;k++){ d[i][j]=min(d[i][j],dp(k,j+1)+k*Sum(i+1,k)); } return d[i][j]; } int cmp(const double a,const double b){ return a > b; } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d %d",&n,&m); int he=0; for(int i=1;i<=n;i++){ scanf("%lf",&sum[i]); he+=sum[i]; } w[0]=0; for(int i=1;i<=n;i++){ w[i]=sum[i]/he; } sort(w+1,w+n+1,cmp); for(int i=1;i<=n;i++){ w[i]=w[i]+w[i-1]; } memset(vis,false,sizeof(vis)); printf("%.4lf\n",dp(0,0)); } return 0; }
相关文章推荐
- uva 1456 - Cellular Network 蜂窝网络 概率DP
- UVa 1456 - Cellular Network(概率DP)
- UVA 1456 Cellular Network 贪心+概率dp
- Uva 1456 - Cellular Network 概率dp
- Uva 1456 - Cellular Network 概率dp
- UVaLive 4731 UVa 1456 - Cellular Network(概率DP 贪心)
- uva 1456 - Cellular Network (贪心+概率+dp)
- Uva 10081 Tight words (概率DP)
- UVA11021 Tribles[离散概率 DP]
- [uva 11762]Race to 1[概率DP]
- UVA 11762 概率dp+期望
- UVA 11427 - Expect the Expected (概率DP 期望)
- UVa 10828 - Back to Kernighan-Ritchie (概率DP 期望 高斯消元)
- UVa 10900 So you want to be a 2n-aire? (概率DP,数学)
- 【DP && 概率 && n个巧克力放m个盒子有盒子是空的概率】UVA - 10648 Chocolate Box
- UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP
- HDU 4089 && UVa 1498 Activation 带环的概率DP
- uva11762 Race to 1 概率dp求期望+记忆化搜索
- UVA - 11021 Tribles 概率dp
- UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP