描述
给出一个仅有+-?组成的且大小为n×m的符号矩阵。其中+表示+1,-表示−1,?表示不确定(可以是+1也可以是-1)。现在请你求出该矩阵的某一行总和的最大值与某一列总和的最小值之间差的最大值。
输入
输入的第一行给出两个整数n,m
随后给出n×m大小的矩阵,仅有+−?组成。
1≤n,m≤1000
输出
输出该矩阵的某一行总和的最大值与某一列总和的最小值之间差的最大值。
样例
输入1:
4 3
+-+
??-
?-?
++?
输出1:
5
输入2:
6 10
??+++-?-?-
-??+???--+
?-+?+-?+--
??????--?+
++--?--+-?
?-?+++?+-?
输出2:
12
提示
样例解释:
该矩阵可以为:
+-+
?--
?-?
+++
只要最后一行满足三个“+”,第三列满足三个“−”一个“+”。这样就是3-(-2)=5。
题解
思路:
找出某一行之和以及某一列之和的最大差 我们先预处理出每一行每一列的+-?的个数 循环判断第i行第j列的最大差是多少 最大差=“行+的数量”+“行?的数量”+“列-的数量”+“列?的数量”-“行-的数量”-“列+的数量” 显然行列之间有一个交点,若交点为?,则在上式基础上-2 时间复杂度O(n^2)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1010,INF=0x3f3f3f3f;
int n,m;
char g[N][N];
int hang0[N],hang1[N],hang2[N];
int lie0[N],lie1[N],lie2[N];
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>g[i];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(g[i][j]=='+') hang1[i]++;
else if(g[i][j]=='-') hang0[i]++;
else hang2[i]++;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(g[j][i]=='+') lie1[i]++;
else if(g[j][i]=='-') lie0[i]++;
else lie2[i]++;
}
}
int ans=-INF,x=-1,y=-1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){//第i行第ji列
int cnt=0;
cnt=hang1[i]-hang0[i]+lie0[j]-lie1[j];
cnt+=hang2[i]+lie2[j];
if(g[i][j]=='?') cnt-=2;
ans=max(ans,cnt);
}
}
cout<<ans;
return 0;
}