1975: 最大方阵和

每次操作,恰好改变两个数的正负号;多次操作,恰好改变偶数个数的正负号。
分类讨论:
- 如果 matrix 有偶数个负数,那么可以把所有数都变成非负数。
- 如果 matrix 有奇数个负数且没有 0,那么最终必然剩下奇数个负数,剩下一个负数是最优的。贪心地,++选择 matrix 中的绝对值最小的数(最小的负数)++,给它加上负号。
- 如果 matrix 有奇数个负数且有 0,那么可以把一个 0 和最终剩下的一个负数操作一次,从而把所有数都变成非负数。
代码实现时,无需特判是否有 0。如果有 0,则代码中的 mn=0,对 ans 无影响。
class Solution {
public:
long long maxMatrixSum(vector<vector<int>>& matrix) {
long long ans=0;
int neg_cnt=0,mn=INT_MAX;
for(auto& row:matrix){ //一行一行看
for(int x:row){
if(x<0){
neg_cnt++;
x=-x; //先把负数都变成正数
}
mn=min(mn,x);
ans+=x;
}
}
if(neg_cnt%2==1){
//奇数个负数,给绝对值最小的数添加负号
ans-=mn*2;
}
return ans;
}
};