因為這題是第一題(其實不是第一題),以為比較簡單,一眼暴力,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...