hdu 5045 Contest(dp)
2014-09-28 10:24
246 查看
题目链接:hdu 5045 Contest
题目大意:一个队伍有N个人,比赛一共有M道题目,给定一个矩阵,表示每个人答对相应题目的正确率。现在对于每道题,可以派出一名学生参加答题,但是在任意时刻,任意两个学生答题数量不能相差2题以上。
解题思路:dp[i][s],表示在第i道题,s表示一个二进制状态,表示哪些人答过题(相应的),2N−1=0
题目大意:一个队伍有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; }
相关文章推荐
- hdu - 5045 - Contest(状态压缩dp)
- hdu 5045 - Contest(2014 ACM/ICPC Asia Regional Shanghai Online )概率dp
- 【DP】 HDU 5045 Contest 状压
- HDU 5045 Contest(状压DP)
- Hdu 5045 Contest (2014 上海Online) (状态压缩dp)
- hdu----(5045)Contest(数位dp)
- hdu 5045 Contest(状态压缩DP)
- Hdu 5045 Contest (状态压缩dp)
- hdu - 5045 - Contest(国家压缩dp)
- HDU 5045 Contest(状压DP或DFS)
- [ACM] hdu 5045 Contest (减少国家Dp)
- HDU 5045 Contest 状态压缩DP
- HDU-5045 Contest(状压DP)
- HDU 5045 Contest(概率dp,状态压缩,2014上海网络赛1004)
- hdu 5045 Contest dp+状态压缩 2014 ACM/ICPC Asia Regional Shanghai Online
- HDU - 5045 2014 ACM/ICPC Asia Regional Shanghai Online D - Contest (状压DP)
- hdu 5045 Contest(状态压缩DP)
- 【DP】 HDU 5045 Contest 状压
- hdu 5045 Contest 状态压缩dp
- [ACM] hdu 5045 Contest (状态压缩Dp)