题目:给出n(1<=n<=50000)个点,k(1<=k<=7)维,求出最远的Manhattan距离。
#include<cstdio>
#include<algorithm>
inline int read(){
int t=getchar(), p=0, f=1;
while(t<'0'||t>'9') {
if(t=='-') f=-1;
t=getchar();
}
while(t>='0'&&t<='9') p=p*10+t-48, t=getchar();
return p*f;
}
int a[10], ma[166], now[166];
int n, k, ans=0, all;
int check(int j){
int t=0, x=1;
for(int i=1;i<=k;i++) t-=a[i];
while(j){
if(j&1) t+=2*a[x];
x++;j>>=1;
}
return t;
}
void Max(int &x, int y){
if(x<y) x=y;
}
int main(){
n=read();k=read();all=(1<<k)-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++) a[j]=read();
for(int j=0;j<=all;j++) now[j]=check(j),Max(ans,now[j]+ma[all-j]);
for(int j=0;j<=all;j++) if(now[j]>ma[j]) ma[j]=now[j];
}
printf("%d\n", ans);
return 0;
}
思路:曼哈顿距离|x1-x2|+|y1-y2|+|z1-z2|.......
因为去绝对值后只有两种符号,所以可以把每一个绝对值拆出来,变成 -x1+x2或x1-x2 依次类推
可以用二进制0和1表示正负,每次就找所有状态中最大的那个就好了