题目链接:https://cometoj.com/contest/59/problem/G?problem_id=2697
思路:dp[i][j],i表示前i个人,j变成二进制后,为1的位置表示这个位置有人打了
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
long long n;
long long dp[100010][60],A[100010][9];
int main()
{
scanf("%lld",&n);
for(long long i=1; i<=n; i++)
{
for(long long j=0; j<5; j++)
scanf("%lld",&A[i][j]);
}
long long ans=0,m=(1<<5)-1;
for(long long i=1; i<=n; i++)
{
for(long long k=0; k<=m; k++)
{
dp[i][k]=max(dp[i][k],dp[i-1][k]);
for(long long j=0; j<5; j++)
{
if(!(k&(1<<j)))
dp[i][k|(1<<j)]=max(dp[i][k|(1<<j)],dp[i-1][k]+A[i][j]);
}
}
}
for(long long i=0; i<=m; i++)
ans=max(ans,dp[n][i]);
printf("%lld\n",ans);
}