http://acm.hdu.edu.cn/showproblem.php?pid=6435
多个属性的差值求和最大值问题。
可以想到最后的答案一定是a1-a2 或者是a2-a1 来组成的,那么我们就可以枚举每个属性前面的符号来取最大值
用状压来实现 1024*n
#include<bits/stdc++.h>
using namespace std;
long long f[111111][7];
long long s[111111][7];
long long fs[111111];
long long ss[111111];
int main(){
int t;
cin>>t;
while(t--)
{
int n,m,k;
int jl[6];
scanf("%d %d %d",&n,&m,&k);
long long ans=-999999999999;
int fina=pow(2,k)-1;
for(int i=0;i<n;i++)
{
for(int j=0;j<=k;j++)
scanf("%lld",&f[i][j]);
}
for(int i=0;i<m;i++)
{
for(int j=0;j<=k;j++)
scanf("%lld",&s[i][j]);
}
for(int i=0;i<=fina;i++)
{
int zs=i;
for(int j=0;j<k;j++)
{
if(zs%2==0)
jl[j]=-1;
else jl[j]=1;
zs=zs/2;
}
long long mif=-999999999999;
long long mis=-999999999999;
for(int j=0;j<n;j++)
{
fs[j]=f[j][0];
for(int q=0;q<k;q++)
{
fs[j]=fs[j]+f[j][q+1]*jl[q];
}
mif=max(mif,fs[j]);
}
for(int j=0;j<m;j++)
{
ss[j]=s[j][0];
for(int q=0;q<k;q++)
{
ss[j]=ss[j]+s[j][q+1]*(-jl[q]);
}
mis=max(mis,ss[j]);
}
ans=max(ans,mif+mis);
}
printf("%lld\n",ans);
}
}