#include <stdio.h>
int main()
{
puts("转载请注明出处[vmurder]谢谢");
puts("网址:blog.csdn.net/vmurder/article/details/44793957");
}
貌似是wyfcyx以前出过的题?
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 35
using namespace std;
int a[N][N],n,m,ans;
bool v[N]; // 表示翻转1,不翻转0
int main()
{
freopen("test.in","r",stdin);
int i,j,k;
scanf("%d",&n),m=n+1>>1;
for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&a[i][j]);
for(int S=(1<<m)-1;~S;S--)
{
int sum=0;
for(i=1;i<=m;i++)
{
v[i]=(S>>i-1)&1;
if(v[i])sum-=a[m][i];
else sum+=a[m][i];
}
for(i=m+1;i<=n;i++)
{
v[i]=v[m]^v[i-m];
if(v[i])sum-=a[m][i];
else sum+=a[m][i];
}
for(i=1;i<m;i++)
{
int x=-a[i][m],y=a[i][m]; // x翻转,y不翻转
if(v[m])x+=a[i+m][m],y-=a[i+m][m];
else x-=a[i+m][m],y+=a[i+m][m];
for(j=1;j<m;j++)
{
int p,q;
if(v[j])
{
p=-a[i][j]+a[i][j+m]+a[i+m][j];
q=-a[i][j]-a[i][j+m]+a[i+m][j];
if(v[m])p+=a[i+m][j+m],q-=a[i+m][j+m];
else p-=a[i+m][j+m],q+=a[i+m][j+m];
p=max(p,-p),q=max(q,-q); // 很巧,,
}
else
{
p=-a[i][j]+a[i][j+m]-a[i+m][j];
q=-a[i][j]-a[i][j+m]-a[i+m][j];
if(v[m])p-=a[i+m][j+m],q+=a[i+m][j+m];
else p+=a[i+m][j+m],q-=a[i+m][j+m];
p=max(p,-p),q=max(q,-q);
}
x+=p,y+=q;
}
sum+=max(x,y);
}
ans=max(ans,sum);
}
cout<<ans<<endl;
return 0;
}
原文地址:http://blog.csdn.net/vmurder/article/details/44793957