您的位置:首页 > 其它

UVA 10827 Maximum sum on a torus .

2016-11-07 18:39 489 查看
题目地址:http://vjudge.net/problem/UVA-10827

就是普通的最大子矩阵和,因为是环面,所以没上边界和下边界,但不能重复加同一个地方

首先想到的就是,上下拼接,左右拼接

#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)
#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)
const int maxn=75*2+5;
int Gird[maxn][maxn],R,a[maxn][maxn];
int getMax(int *A,int n){
int temp=0,ans=-(1<<30);
REP(i,n,n+R-1){
if(temp<0) temp=A[i];
else temp+=A[i];
ans=max(ans,temp);
}
return ans;
}
int solve(){
int ans=-(1<<30);
REP(i,1,R){
memset(a,0,sizeof(a));
REP(j,i,i+R-1) {
REP(k,1,R) {
REP(l,k,k+R-1)
a[k][l]+=Gird[j][l];
ans=max(ans,getMax(a[k],k));
}
}
}
return ans;
}
int main(int argc, char const *argv[])
{
int T; scanf("%d",&T);
while(T--){
scanf("%d",&R);
REP(i,1,R) REP(j,1,R) {scanf("%d",&Gird[i][j]); Gird[i+R][j]=Gird[i][j+R]=Gird[i+R][j+R]=Gird[i][j]; }
printf("%d\n", solve());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: