包括題目:acwing 717 簡單斐波那契,acwing 95 費解的開關(也是演算法競賽高階指南例題)。
遞推與遞迴恰恰相反。遞推是以問題邊界為起點向原問題正向推導。
#include
#include
#include
#include
typedef
long
long ll;
using
namespace std;
const
int maxn =
1e7;
// 斐波那契節省空間做法
// a b 滾動
intmain()
return0;
}
費解的開關 ** 牛客網
時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 32768k,其他語言65536k
64bit io format: %lld
題目描述
你玩過「拉燈」遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應:和這個燈上下左右相鄰的燈也要相應地改變其狀態。10111我們用數字「1」表示一盞開著的燈,用數字「0」表示關著的燈。下面這種狀態
01101
10111
10000
11011
在改變了最左上角的燈的狀態後將變成:01111
11101
10111
10000
11011
再改變它正中間的燈後狀態將變成:01111
11001
11001
10100
11011
給定一些遊戲的初始狀態,編寫程式判斷遊戲者是否可能在6步以內使所有的燈都變亮。輸入描述:
第一行有乙個正整數n,代表資料中共有n個待解決的遊戲初始狀態。輸出描述:以下若干行資料分為n組,每組資料有5行,每行5個字元。每組資料描述了乙個遊戲的初始狀態。各組資料間用乙個空行分隔。 對於30%的資料,n
\leq 5n≤5; 對於100%的資料,n \leq 500n≤500。
輸出資料一共有n行,每行有乙個小於等於6的整數,它表示對於輸入資料中對應的遊戲狀態最少需要幾步才能使所有燈變亮。對於任意的狀態,我們知道:如果將第一行置為全1,那麼只需要從第二行開始考慮。從第二行開始:對於為 0 的位置,因為第一行已經確定,想要進行改變的話,只能變化第三行相鄰位置(不管後邊的狀態,我們只需要考慮區域性最優 即 遍歷過的行全 1),依次遍歷最後一行之外的行,在最後一行只需要檢驗是否全為 1,因為以上操作都是區域性最優(此處用詞不知道是否準確)的原理,如果全 1 那麼可行,否則這種操作就無解。對於某乙個遊戲初始狀態,若6步以內無法使所有燈變亮,請輸出「-1」。
我們列舉第一行可能有的操作,共有 2 ^ 5 = 32 種,記錄每一次操作需要的 step 和 dark 即可。
#include
#include
#include
#include
using
namespace std;
const
int n =6;
char g[n]
[n], backup[n]
[n];
// 備份陣列backup
int dx[5]
=, dy[5]
=;void
turn
(int x,
int y)
}int
main()
}for
(int i =
0; i <
4; i++)}
}bool dark =
false
;// 下邊遍歷第五行 看是否還有0存在
for(
int i =
0; i <
5; i++)}
if(!dark) res =
min(res, step)
;memcpy
(g, backup,
sizeof g)
;// 用備份對 g 陣列還原 }if
(res >
6) res =-1
; cout << res << endl;
}return0;
}
藍橋杯遞推 牆壁塗色
蒜頭君覺得白色的牆面好單調,他決定給房間的牆面塗上顏色。他買了3 種顏料分別是紅 黃 藍,然後把房間的牆壁豎直地劃分成 n 個部分,蒜頭希望每個相鄰的部分顏色不能相同。他想知道一共有多少種給房間上色的方案。例如,當n 5時,下面就是一種合法方案。藍紅黃紅黃 由於牆壁是乙個環形,所以下面這個方案就是不...
藍橋杯 翻硬幣(遞推)
注 該題目來自第四屆藍橋杯省賽c c b組 題面如下 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要...
藍橋杯dfs搜尋專題
includeusing namespace std dfs i 第i個雷射機器 有兩種選擇 vis i 1 0 時 可選,無論vis i 1 為何值都不選 vis i 回溯標記是否用過 int n 30 int vis 35 int ans 0 int dp 35 void dfs int x d...