CF983C elevator 記憶化搜尋

2022-05-25 15:42:23 字數 1778 閱讀 2887

(題面來自luogu)

乙個9層的樓有乙個可以容納4個人的電梯,你要管理這個電梯。

現在各層樓上有一些在排隊的人,你知道他們在哪層要到哪層去。你也知道到電梯門口的順序。根據公司的規定,如果乙個人比其他人早到。他也必須先進電梯(無論樓層,只憑時間)。注意人們可以隨時離開電梯。

電梯有兩個命令:

最初電梯是空的,在1樓。你需要求出最少用多長時間來吧所有人送回到目的地。最後電梯可以停在任意位置

資料範圍:人數小於等於2000。

不知道從**搞來的這麼偏門的考試題……一道很噁心的狀壓dp,需要壓縮的狀態是當前電梯內四個人要去的樓層。在設計狀態時,要盡可能簡化題目中的資訊,只抽出那些真正可能影響答案的本質。

由於人是按次序上電梯的,我們只能按編號逐個處理,這一維的轉移結構也就確定了。緊接著設計了當前電梯的執行狀態這一資訊:假設處理時電梯從底下上行而來,回到電梯來的樓層顯然會重複狀態,是不會更優的。第三維記錄電梯所在樓層,第四維則是當前電梯內幾個人要去的樓層,0表示空位。這個狀態用map壓起來,用康托展開也是可以的。

那麼每次對於每個狀態,如果電梯有人可以下或者下乙個要處理的人剛好在這一層,我們就讓電梯停下來,貪心地把這些事處理完,再來考慮執行。現在如果電梯停著,我們就讓它上下動動;如果正在執行,我們就讓它繼續沿著當前方向執行,保證不會重複。

**:#include 

#include 

#include 

#include 

#include 

#include 

#define mp make_pair  

#define st first  

#define dst second  

using namespace std;  

void open_file(string s)   

int f[2010][3][9][715], n;//第一維當前處理人數,第二維執行方向,第三維樓層(0~8),第四維當前裝載狀態   

mapint>, int> m;  

vector load[715];  

pair p[2010];  

bool cmp(int a, int b)   

int dfs(int cur, int op, int fl, int key)   

if (cur <= n && p[cur].st == fl + 1 && tmp[3] == 0)   

//接下來是啥也沒拉到的情況   

if (op == 0)  //停著就上下動動   

return ans = min(dfs(cur, 1, fl + 1, key), dfs(cur, 2, fl - 1, key)) + 1;  

else if (op == 1) //繼續往上   

return ans = dfs(cur, 1, fl + 1, key) + 1;  

else   

return ans = dfs(cur, 2, fl - 1, key) + 1;  

}  int main()   

//  cout << cnt;//最多715種狀態   

cin >> n;  

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

cin >> p[i].st >> p[i].dst;  

cout << dfs(1, 1, 0, 0) << endl;  

return 0;  

}  我感覺這題只能搜尋,因為不知道電梯會在**停下,遞推轉移可能會很麻煩。(歡迎推翻這個flag)

skiing 記憶化深搜

這道題就是找出一條最長連續遞減序列,並求出其長度。可以用記憶化深搜,求出每一點最長序列的長度,然後求最大值即可。如下 include includeusing namespace std const int n 105 int a n n m,n,f n n inline int max int a...

poj1661Help Jimmy 記憶化搜尋

這是找的倒數第二簡單的,然而依舊不會,淚 昨天晚上調出來發現是 以示例為例 從倒數第二個平台直接跳下去 時間是0 從上面第乙個跳下去 時間依舊是0 orz 12點半躺床上頓悟應該每個平台的時間不僅是乙個,有左右兩個時間 唯一值得欣慰是發現了 dp值裡面不用加上高度下落的時間差,最後dp 下落的高度,...

HDU1501 Zipper(DFS 記憶化搜尋)

題意 給三個字串,保證第三個串長度是前兩個串長度之和,確定前兩個串保持原有的字母順序能不能拼成第三個串。思路 直接搜尋的話會有大量重複的運算,要用記憶化陣列記錄之前的結果。當匹配到第乙個串的第i位和第二個串的第j位時,前面可能有多種情況,但三個串後面的長度一定,所以結果也可以確定,用vis i j ...