题目链接:看守
想一下一维的距离我们会怎么求?直接找最大值和最小值即可。
但是对于二维即以上,因为存在负数不能直接每个维度加起来,求max和min。
但是我们可以注意到,维度不多,所以我们壮举每一个状态的维度和即可,最后取每个状态答案的最大值。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+10,inf=0x3f3f3f3f;
int n,d,a[N][1<<4],c[1<<4],res;
signed main(){
cin>>n>>d;
for(int i=1;i<=n;i++){
for(int j=0;j<d;j++) scanf("%d",&c[j]);
for(int s=0;s<(1<<d);s++){
for(int j=0;j<d;j++)
if(s>>j&1) a[i][s]+=c[j];
else a[i][s]-=c[j];
}
}
for(int s=0;s<(1<<d);s++){
int mx=-inf,mi=inf;
for(int i=1;i<=n;i++) mx=max(mx,a[i][s]),mi=min(mi,a[i][s]);
res=max(res,mx-mi);
}
cout<<res;
return 0;
}