题目的意思是,把一个二维0,1 nxm的矩阵,看成n个二进制数(m位),经过任意次行/列的01翻转,求这n个数和的最大值。
这道题是典型的换维思考的题目,分两步来做,(1)通过行翻转使每一个数的首位为1,(2)通过列翻转得到每一列的最大值。
代码如下:
class Solution {
public:
int matrixScore(vector<vector<int>>& a) {
int ret;
rs=a.size();
cs=a[0].size();
for(int i=0;i<rs;i++)
{
if(a[i][0] == 0)
{
for(int j=0;j<cs;j++)
{
a[i][j] = 1-a[i][j];
}
}
}
ret=(1<<(cs-1))*rs;
//cout<<ret<<endl;
for(int j=1;j<cs;j++)
{
int sumc=0;
for(int i=0;i<rs;i++)
{
sumc+=a[i][j];
}
sumc=max(sumc,rs-sumc);
// cout<<sumc<<endl;
ret+=(sumc<<(cs-j-1));
}
return ret;
}
int rs;
int cs;
};
其中有技巧是求x2的幂的方法,是直接将数右移。