สมมติว่าเรามีเมทริกซ์ไบนารี 2 มิติ สำหรับแถวหรือคอลัมน์ใดๆ ในเมทริกซ์ที่กำหนด เราสามารถพลิกบิตทั้งหมดได้ หากเราสามารถดำเนินการเหล่านี้จำนวนเท่าใดก็ได้ และเราถือว่าแต่ละแถวเป็นเลขฐานสอง เราต้องหาผลรวมที่ใหญ่ที่สุดที่สามารถสร้างได้จากตัวเลขเหล่านี้
ดังนั้นหากอินพุตเป็นแบบ
0 | 1 | 0 |
0 | 0 | 1 |
แล้วผลลัพธ์จะเป็น 11 ราวกับว่าเราพลิกทั้งสองแถวเราจะได้ 101 และ 110 ผลรวมคือ 5 + 6 =11
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สำหรับแต่ละแถว r ในเมทริกซ์ ทำ
- ถ้า r[0] เหมือนกับ 0 แล้ว
- สำหรับฉันในช่วง 0 ถึงขนาดของ r ทำ
- r[i] :=-r[i] + 1
- สำหรับฉันในช่วง 0 ถึงขนาดของ r ทำ
- ถ้า r[0] เหมือนกับ 0 แล้ว
- สำหรับ j ในช่วง 1 ถึงขนาดคอลัมน์ของเมทริกซ์ ทำ
- cnt :=0
- สำหรับ i ในช่วง 0 ถึงจำนวนแถวของเมทริกซ์ ทำ
- cnt :=cnt + 1 ถ้า matrix[i, j] เป็น 1 มิฉะนั้น -1
- ถ้า cnt <0 แล้ว
- สำหรับ i ในช่วง 0 ถึงขนาดแถวของเมทริกซ์ ทำ
- เมทริกซ์[i, j] :=-เมทริกซ์[i, j] + 1
- สำหรับ i ในช่วง 0 ถึงขนาดแถวของเมทริกซ์ ทำ
- ตอบ :=0
- สำหรับแต่ละแถว r ในเมทริกซ์ ทำ
- a :=0
- สำหรับแต่ละ v ใน r ทำ
- a :=2 * a + v
- ans :=ans + a
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, matrix): for r in matrix: if r[0] == 0: for i in range(len(r)): r[i] = -r[i] + 1 for j in range(1, len(matrix[0])): cnt = 0 for i in range(len(matrix)): cnt += 1 if matrix[i][j] else -1 if cnt < 0: for i in range(len(matrix)): matrix[i][j] = -matrix[i][j] + 1 ans = 0 for r in matrix: a = 0 for v in r: a = 2 * a + v ans += a return ans ob = Solution() matrix = [ [0, 1, 0], [0, 0, 1] ] print(ob.solve(matrix))
อินพุต
[[0, 1, 0],[0, 0, 1]]
ผลลัพธ์
11