題目鏈接: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個人分別完成m個編程問題的成功率,問怎樣分配可以使得最終期望的AC問題數(shù)最多。有一個限制,(每個人耗時1小時完成1道題)任意時刻,任何兩個選手間的耗時數(shù)差不能超過1個小時。
解題:
??? 突破點在于耗時數(shù)差不能超過1個小時,我是沒想到用01表示當前每個選手的答題數(shù)量減去一個基準值,如果想到了就很好寫了。感覺狀態(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存的是每個選手答每道題的正確概率
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]);
//兩個set配合使用記錄前一步合法狀態(tài)
set s;
set ts;
set :: iterator it;
//初始化
for(int j=0;jdp[j][tmp])
dp[j][tmp]=temp;
}
}
}
//將ts的內容放入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;
}