首页 > 代码库 > HDU 5045 DP+状压

HDU 5045 DP+状压

2014 ACM/ICPC Asia Regional Shanghai Online

给出N个人做M道题的正确率,每道题仅仅能由一个人做出,而且当全部人都做出来且仅做出一道题时,做过题的人才干够继续做题,求最大期望。

一共仅仅有10个人,状压存储每一个人是否已经做出题目,假设都作出则状态清0。


#include "stdio.h"
#include "string.h"

double Max(double a,double b)
{
	if (a<b) return b;else return a;
}
double ans,dp[1010][1050],a[1010][1010];
int main()
{
	int Case,ii,i,j,aim,k,n,m,peo;

	scanf("%d",&Case);
	for (ii=1;ii<=Case;ii++)
	{
		scanf("%d%d",&n,&m);
		for (i=1;i<=n;i++)
			for (j=1;j<=m;j++)
				scanf("%lf",&a[i][j]);

		printf("Case #%d: ",ii);

		aim=(1<<n)-1;
		for (i=0;i<=m;i++)
			for (j=0;j<=aim;j++)
				dp[i][j]=-1;

		dp[0][0]=0;

		for (j=1;j<=m;j++)
			for (i=0;i<=aim;i++)
				if (dp[j-1][i]!=-1)
					for (k=1;k<=n;k++)
					{
						peo=1<<(k-1);
						if ((i&peo)==peo) continue;
						peo|=i;
						if (peo==aim) peo=0;

						dp[j][peo]=Max(dp[j][peo],dp[j-1][i]+a[k][j]);
					}
		ans=0;
		for (i=0;i<=aim;i++)
			ans=Max(ans,dp[m][i]);

		printf("%.5lf\n",ans);
	}
}



HDU 5045 DP+状压