貪心 最大矩陣

2021-08-26 05:19:40 字數 1495 閱讀 3056

有乙個二維矩陣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 它擁有...