有乙個二維矩陣a其中每個元素的值為0或1。移動是指選擇任一行或列,並轉換該行或列中的每乙個值:將所有0都更改為1,將所有1都更改為0。
在做出任意次數的移動後,將該矩陣的每一行都按照二進位制數來解釋,矩陣的得分就是這些數字的總和。返回盡可能高的分數。
示例:輸入:[[0,0,1,1],[1,0,1,0],[1,1,0,0]]
輸出:39
解釋:轉換為 [[1,1,1,1],[1,0,0,1],[1,1,1,1]] 0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39
反轉後矩陣最大值
[[0,0,1,1],[1,0,1,0],[1,1,0,0]]分析
1、二進位制數轉換成十進位制:
1111 = 12^3 + 12^2 + 12^1 + 12^0 = 8 + 4 + 2 + 1 = 15
2、對本題使用貪心演算法:要想二進位制數解釋後的數大,則最高位不為0,每位數盡可能多的不為0(盡可能多的為1)
所以:首先進行行變換!行變換!行變換!(使得最高位為1),
然後再進行列變換!列變換!列變換!(使每一列的1多餘0)
如圖:(樣例資料)
3、本題需注意:
①、本題輸入不是以二維陣列形式輸入的,是以字串輸入的
②、本題要求自行判斷二維陣列的行、列數
#includeint main(); //cout:計數每一列0的個數
int sum = 0, sum2, sumj;
int count_i = 0, count_j = 0, t[100][100]; //t:將字串數字分離儲存為二維陣列形式
char str[100]; //儲存輸入的字串
gets(str); //輸入字串
//自行判斷行數、列數
for(i = 0; str[i] != '\0'; i ++)
}} count_j = a;
//首先行轉換
for(i = 0; i < count_i; i ++)
} }
//計數每列0的個數
for(i = 0; i < count_j; i ++) }
//然後進行列轉換
for(i = 0; i < count_j; i ++)
} }
//得出結果
for(i = 0; i < count_i; i ++)
sum += sumj;
} printf("%d",sum);
return 0;
}
貪心 最大子矩陣
最大子矩陣 總時間限制 1000ms 記憶體限制 65536kb 描述 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1...
最大子矩陣(貪心)
總時間限制 1000ms 記憶體限制 65536kb 描述 已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1 8 這個子...
最大子矩陣 字首和 貪心
給定乙個包含整數的二維矩陣,子矩形是位於整個陣列內的任何大小為1 1或更大的連續子陣列。矩形的總和是該矩形中所有元素的總和。在這個問題中,具有最大和的子矩形被稱為最大子矩形。例如,下列陣列 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩形為 9 2 4 1 1 8 它擁有...