hdu5045Contest 概率dp
来源:互联网 发布:小黄车密码锁破解软件 编辑:程序博客网 时间:2024/06/06 18:48
//已知N个人对M道题做对的概率
//怎样安排这N个人做这M道题使得其期望最大
//要求任意时间任意两个人的做题差不大于1,换句话说,就是在没N道题中必须是不同的人做
//可以用dp[i][j] 表示做到第i道题,且做题情况是j状态得到的最大期望
//由于每N道题必须是不同的N个人做,所以当j的状态达到(1<<n)-1是将状态转移到0
//dp[i][k] = max(dp[i][k] , p[j+1][i] + dp[i-1][k^(1<<j)]) ;
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 1010 ;
double dp[maxn][1<<10] ;
double p[100][maxn] ;
int main()
{
// freopen("in.txt","r" , stdin) ;
int T , n , m ;
int cas = 0 ;
scanf("%d" , &T) ;
while(T--)
{
scanf("%d%d" , &n, &m) ;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
scanf("%lf" , &p[i][j]) ;
for(int i = 0;i <= m;i++)
for(int j = 0;j < (1<<n) ;j++)
dp[i][j] = -1 ;
dp[0][0] = 0 ;
for(int i = 1;i <= m;i++)
{
for(int j = 0;j < n;j++)
for(int k = 1;k <= ((1<<n)-1);k++)
{
if((k&(1<<j)) == 0)continue ;
if(dp[i-1][k^(1<<j)] == -1)
continue ;
dp[i][k] = max(dp[i][k] , p[j+1][i] + dp[i-1][k^(1<<j)]) ;
}
if(i%n == 0)
{
dp[i][0] = dp[i][(1<<n)-1] ;
dp[i][(1<<n)-1] = -1 ;
}
}
double sum = 0;
for(int i = 0;i < (1<<n)-1 ;i++)
sum = max(sum , dp[m][i]);
printf("Case #%d: ",++cas) ;
printf("%.5lf\n" ,sum) ;
}
return 0 ;
}
//怎样安排这N个人做这M道题使得其期望最大
//要求任意时间任意两个人的做题差不大于1,换句话说,就是在没N道题中必须是不同的人做
//可以用dp[i][j] 表示做到第i道题,且做题情况是j状态得到的最大期望
//由于每N道题必须是不同的N个人做,所以当j的状态达到(1<<n)-1是将状态转移到0
//dp[i][k] = max(dp[i][k] , p[j+1][i] + dp[i-1][k^(1<<j)]) ;
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 1010 ;
double dp[maxn][1<<10] ;
double p[100][maxn] ;
int main()
{
// freopen("in.txt","r" , stdin) ;
int T , n , m ;
int cas = 0 ;
scanf("%d" , &T) ;
while(T--)
{
scanf("%d%d" , &n, &m) ;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
scanf("%lf" , &p[i][j]) ;
for(int i = 0;i <= m;i++)
for(int j = 0;j < (1<<n) ;j++)
dp[i][j] = -1 ;
dp[0][0] = 0 ;
for(int i = 1;i <= m;i++)
{
for(int j = 0;j < n;j++)
for(int k = 1;k <= ((1<<n)-1);k++)
{
if((k&(1<<j)) == 0)continue ;
if(dp[i-1][k^(1<<j)] == -1)
continue ;
dp[i][k] = max(dp[i][k] , p[j+1][i] + dp[i-1][k^(1<<j)]) ;
}
if(i%n == 0)
{
dp[i][0] = dp[i][(1<<n)-1] ;
dp[i][(1<<n)-1] = -1 ;
}
}
double sum = 0;
for(int i = 0;i < (1<<n)-1 ;i++)
sum = max(sum , dp[m][i]);
printf("Case #%d: ",++cas) ;
printf("%.5lf\n" ,sum) ;
}
return 0 ;
}
0 0
- hdu5045Contest 概率dp
- 概率dp
- ##概率dp##
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率DP
- 概率DP
- 概率dp
- 概率dp
- dp-概率dp
- 【区间dp,概率dp】
- HDU5045Contest(记忆化搜索)
- LeetCode(40) Combination Sum II
- 开门人和关门人
- 通知Notification
- Android开发之获取相册照片和获取拍照照片
- 评委会打分
- hdu5045Contest 概率dp
- 一个奇怪的问题-1
- Android开发之获取相册照片和获取拍照照片二
- ZOJ 1241 Geometry Made Simple
- Snail—UI学习之UIButton
- mssql2008 r2远程连接设置
- 冒泡排序
- ViewPager
- 猫猫学iOS之小知识之xcode6自动提示图片插件 KSImageNamed的安装