给定一个仅包含0和1的n* n二维矩阵
请计算二维矩阵的最大值
计算规则如下
1、每行元素按下标顺序组成一个二进制数(下标越大约排在低位),
二进制数的值就是该行的值,矩阵各行之和为矩阵的值
2、允许通过向左或向右整体循环移动每个元素来改变元素在行中的位置
比如
[1, 0, 1, 1, 1] 向右整体循环移动两位[1, 1, 1, 0, 1]
二进制数为11101 值为29
[1, 0, 1, 1, 1] 向左整体循环移动两位[1, 1, 1, 1, 0]
二进制数为11110 值为30
输入描述
1.数据的第一行为正整数,记录了N的大小
0 < N <= 20
2.输入的第2到n + 1行为二维矩阵信息
行内元素边角逗号分割
输出描述
没行右移 5
1, 0, 0, 0, 1
0, 0, 0, 1, 1
0, 1, 0, 1, 0
1, 0, 0, 1, 1
1, 0, 1, 0, 1
输出
122,矩阵的最大值和
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int N;
cin >> N;
vector<vector>arr(N,vector(N));
getchar();
for (int i = 0; i < N; i++) {
int j = 0;
string s;
getline(cin, s);
istringstream s1(s);
int len = 0;
while(len<s.length() ){
arr[i][j++] =s[len];
len += 2;
}
}
int count = 0;
for (int i = 0; i < arr.size(); i++)
{
int nmax = INT32_MIN;
string stemp;
for (int j = 0; j < N; j++)
{
stemp+= arr[i][j];
}
int k = 0;
int sum = 0;
while (k < stemp.length())
{
char s = stemp[0];
stemp.erase(stemp.begin());
stemp.push_back(s);
k++;
sum = stoi(stemp,nullptr,2);
nmax = max(sum, nmax);
}
count += nmax;
}
cout << count << endl;
return 0;
}