演算法競賽高階指南 0x02 費解的開關

2022-09-15 02:00:21 字數 1560 閱讀 7227

因為這題是第一題(其實不是第一題),以為比較簡單,一眼暴力,256。算的時候少算了一位,以為規模是1e7,導致樣例都算很慢,慢到我以為是死迴圈。找了半天死迴圈才發現這個**其實能出結果...

然後就按照普通的翻轉問題一行一行處理。**惡臭,而且有一處變數名寫錯查了半個多小時。下面標出錯誤的地方

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct

nd node[

10000005

];int a[6][6], tot, ax[6][6

];const

int oprx = , opry = ;

void gn(int

sum)

}inline

int res(int

x) }

}for (i = 1; i < 6; i++)

return

ret;

}int

main()

printf(

"%d\n

", ans);

}return0;

}

後面隊友提供了記憶化搜尋的思路。大致是給矩陣的25個元素依次分乙個位,形成乙個二進位制數,以這個二進位制數作為儲存中間結果的標識(狀態)。

原本的思路是從0開始,求出每個標識到最終答案所需操作次數,超過六次的直接記非法。但隊友指出,這樣會造成大量不必要的計算,不如從最終答案開始,(用乙個bfs)把所有從最終答案開始六步之內能到的狀態標上。

有關狀態的訪問,原本想偷懶,每一次將狀態展開為矩陣操作,操作完再轉為狀態。但還是那個隊友,指出:相鄰元素在狀態中相差的位數是一定的,只需要判斷邊界值就可以。

然後就還算順利地寫出了**。寫完因為狀態沒及時轉移,狀態重複訪問導致死迴圈。後面因為結構體中建構函式寫錯卡了半天,期間還在想是不是輸入和輸出的狀態反了。經過推導,確實是反了,但因為矩陣是對稱的,其實反不反對答案沒有影響

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int dp[1

<< 25

];struct

node

};void

bfs()}}

}int

main()

}printf(

"%d\n

", dp[x]);

}return0;

}

演算法競賽高階指南 0x02 D 費解的開關

題目鏈結 你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字 1 表示一盞開著的燈,用數字 0 表示關著的燈。下面這種狀...

《演算法競賽高階指南》0x02 遞迴與遞推 學習總結

感受 遞迴中的分形太簡單了,基本就是個找規律 遞迴,講一講分治 分治,即分而治之 個人認為,其實它和二分差不多 或者二分其實是它的一部分?二分和分治的區別,在我看來,是二分需要有決策單調性,而分治貌似不需要?借助分治,把答案的複雜度從n 2降級到nlogn 其中,還是二分的思路,先把問題的當前狀態一...

演算法競賽高階指南 費解的開關

你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字 1 表示一盞開著的燈,用數字 0 表示關著的燈。下面這種狀態 101...