您的位置:首页 > 其它

hdu 5045 Contest(dp)

2014-09-28 10:24 246 查看
题目链接:hdu 5045 Contest

题目大意:一个队伍有N个人,比赛一共有M道题目,给定一个矩阵,表示每个人答对相应题目的正确率。现在对于每道题,可以派出一名学生参加答题,但是在任意时刻,任意两个学生答题数量不能相差2题以上。

解题思路:dp[i][s],表示在第i道题,s表示一个二进制状态,表示哪些人答过题(相应的),2N−1=0
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 15;
const int maxm = 2005;
const int maxs = (1<<10) + 5;
const double INF = 0x3f3f3f3f;

int N, M;
double p[maxn][maxm], dp[maxm][maxm];

void init () {
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++) {
for (int j = 1; j <= M; j++)
scanf("%lf", &p[i][j]);
}
}

double solve () {
int T = 1<<N;
for (int i = 0; i <= M; i++)
for (int j = 0; j < T; j++)
dp[i][j] = -INF;
dp[0][0] = 0;

for (int i = 1; i <= M; i++) {
for (int s = 0; s < T; s++) {
for (int k = 0; k < N; k++) {
if (s & (1<<k))
continue;
dp[i][s | (1<<k)] = max(dp[i][s | (1<<k)], dp[i-1][s] + p[k][i]);
}
}
dp[i][0] = dp[i][T-1];
}

double ret = 0;
for (int i = 0; i < T; i++)
ret = max(ret, dp[M][i]);
return ret;
}

int main () {
int cas;
scanf("%d", &cas);
for (int kcas = 1; kcas <= cas; kcas++) {
init();
printf("Case #%d: %.5lf\n", kcas, solve());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: