https://leetcode-cn.com/problems/maximum-matrix-sum/
思路:可恶啊,居然被这道题卡了。对于矩阵中任意两个坐标,我们可以找到一条从起始坐标到终止坐标的路径,那么对这条路径上所有相邻点做一次操作,最后的结果就是起始位置和终止位置的值取反,其余值不变。想到这一点就比较好做了,我们可以使用这种方式让所有的负数成对内耗掉,根据贪心想法自然要从小到大开始。需要注意的一点是如果负数的个数是奇数个,那么最终会剩下一个最大的负数没有被消耗掉。此时我们有两种选择:
- 不做任何操作。
- 把该负数和最小的正数取反。
取更优的方案即可。
class Solution {
public:
long long maxMatrixSum(vector<vector<int>>& matrix) {
using ll=long long;
ll ans=0;
int minVal=0x3f3f3f3f,negativeCnt=0;
for(vector<int>& vec:matrix)
{
for(int& num:vec)
{
if(num<0)
++negativeCnt;
int tmp=abs(num);
ans+=tmp;
minVal=min(minVal,tmp);
}
}
if(negativeCnt&1)
ans-=minVal<<1;
return ans;
}
};