HDU 5045 Contest (狀態(tài)壓縮dp)
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5045
題面:
Contest Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1237????Accepted Submission(s): 494
Problem Description In the ACM International Collegiate Programming Contest, each team consist of three students. And the teams are given 5 hours to solve between 8 and 12 programming problems.
On Mars, there is programming contest, too. Each team consist of N students. The teams are given M hours to solve M programming problems. Each team can use only one computer, but they can’t cooperate to solve a problem. At the beginning of the ith hour, they will get the ith programming problem. They must choose a student to solve this problem and others go out to have a rest. The chosen student will spend an hour time to program this problem. At the end of this hour, he must submit his program. This program is then run on test data and can’t modify any more.
Now, you have to help a team to find a strategy to maximize the expected number of correctly solved problems.
For each problem, each student has a certain probability that correct solve. If the ith student solve the jth problem, the probability of correct solve is Pij .
At any time, the different between any two students’ programming time is not more than 1 hour. For example, if there are 3 students and there are 5 problems. The strategy {1,2,3,1,2}, {1,3,2,2,3} or {2,1,3,3,1} are all legal. But {1,1,3,2,3},{3,1,3,1,2} and {1,2,3,1,1} are all illegal.
You should find a strategy to maximize the expected number of correctly solved problems, if you have know all probability ?
Input The first line of the input is T (1 ≤ T ≤ 20), which stands for the number of test cases you need to solve.
The first line of each case contains two integers N ,M (1 ≤ N ≤ 10,1 ≤ M ≤ 1000),denoting the number of students and programming problem, respectively.
The next N lines, each lines contains M real numbers between 0 and 1 , the jth number in the ith line is Pij . ?
Output For each test case, print a line “Case #t: ”(without quotes, t means the index of the test case) at the beginning. Then a single real number means the maximal expected number of correctly solved problems if this team follow the best strategy, to five digits after the decimal point. Look at the output for sample input for details. ?
Sample Input 1 2 3 0.6 0.3 0.4 0.3 0.7 0.9 ?
Sample Output Case #1: 2.20000 ?
Source 2014 ACM/ICPC Asia Regional Shanghai Online
題目大意:
??? 給定n個(gè)人分別完成m個(gè)編程問題的成功率,問怎樣分配可以使得最終期望的AC問題數(shù)最多。有一個(gè)限制,(每個(gè)人耗時(shí)1小時(shí)完成1道題)任意時(shí)刻,任何兩個(gè)選手間的耗時(shí)數(shù)差不能超過1個(gè)小時(shí)。
解題:
??? 突破點(diǎn)在于耗時(shí)數(shù)差不能超過1個(gè)小時(shí),我是沒想到用01表示當(dāng)前每個(gè)選手的答題數(shù)量減去一個(gè)基準(zhǔn)值,如果想到了就很好寫了。感覺狀態(tài)壓縮dp的精髓在于人為地篩選出一些合法的狀態(tài),減少盲目搜索,從而提高效率。
代碼:
#include
#include
#include
#include
#include
using namespace std;
int n,m,t;
//dp[i][j]表示第i位答題狀態(tài)為j的最優(yōu)值,posi存的是每個(gè)選手答每道題的正確概率
double dp[1010][1050],posi[11][1010];
int main()
{
int tmp,lim;
scanf("%d",&t);
double ans,temp;
for(int i=1;i<=t;i++)
{
//讀入
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
scanf("%lf",&posi[j][k]);
//兩個(gè)set配合使用記錄前一步合法狀態(tài)
set s;
set ts;
set :: iterator it;
//初始化
for(int j=0;jdp[j][tmp])
dp[j][tmp]=temp;
}
}
}
//將ts的內(nèi)容放入s
s.clear();
for(it=ts.begin();it!=ts.end();it++)
s.insert(*it);
}
lim=(1<ans)
ans=dp[m][j];
}
printf("Case #%d: %.5lfn",i,ans);
}
return 0;
}