UVa11464偶數矩陣 部分列舉 遞推

2021-06-19 09:41:13 字數 892 閱讀 7458

題意:有乙個n*n的01矩陣,任務是把盡可能少的0變成1,使得每個元素的上、下、左、右元素之和為偶數。(n<=15)

0 0 0          0 1 0

1 0 0  ----->  1 0 1       需要3次變化

0 0 0          0 1 0

思路:最容易想到列舉所有數字變或不變,2^(15*15)= 2^255 就是5 * 10^67左右。。。。

注意到n小於16,列舉一行的代價是2^15=32768,我們完全可以列舉第一行,根據第一行推導出其餘的行。

複雜度降為為o(2^n * n^2)

#include using namespace std;

#define maxn 20

#define inf 1000000000

#define min(a, b) ((a) < (b) ? (a) : (b))

int a[maxn][maxn], b[maxn][maxn], n;

int check(int num) }

int cnt = 0;

for (i = 0; i < n; i++)

for (int j = 0; j < n; j++)

if(a[i][j] != b[i][j]) cnt ++;

return cnt;

}int main()

{ int t;

cin>>t;

while (t--)

{ cin>>n;

for (int i = 0; i < n; i++)

for (int j = 0; j < n; j++)

cin>>a[i][j];

int ans = inf;

for (i = 0; i < (1<

uva 11464 暴力列舉矩陣

這個題也是乙個列舉子集暴力,訓練賽的時候沒有做出來,這個對於矩陣的表示,偶數矩陣就是乙個位置的上下左右加起來都是偶數,才能算是偶數矩陣,直接暴力列舉第一行,然後確定下面的位置,然後如果有衝突那就不對,如果沒有衝突,然後比對,與之前的矩陣的變換,就可以獲得改變次數,然後每次取最小。include in...

uva11464 偶矩陣,推理題

明天省賽,所以今天做幾道所謂水題,可惜這個題因為輸出寫錯wa了很久,如果直接列舉矩陣所有的位置是否改變,那麼時間複雜度是承受不住的 這道題讓我學到的,就是 1 遇到題先手算模擬,然後嘗試找規律吧。這道題的規律就是 第一行一旦確定,那麼整個矩陣就可以確定,所以列舉第一行,還可以的 2 if else ...

uva 11464 偶數矩陣 (二進位制表示法)

題目大意 有乙個n n的01矩陣,你的任務是把盡量少的0變成1,但不能將1變成0 以使得每個元素的上下左右的元素 若存在 均為偶數。思路 如果暴力列舉每乙個位置的話時間複雜度為 2 的255 次方,肯定不行 但是如果只列舉第一行,其他下面幾行都能夠通過 上邊的來固定是0還是1。時間複雜度就是 2的1...