參加考試的最大學生數 耐心記錄思路

2021-10-10 13:11:39 字數 1710 閱讀 6144

1349. 參加考試的最大學生數

給你乙個 m * n 的矩陣 seats 表示教室中的座位分布。如果座位是壞的(不可用),就用 '#' 表示;否則,用 '.' 表示。

學生可以看到左側、右側、左上、右上這四個方向上緊鄰他的學生的答卷,但是看不到直接坐在他前面或者後面的學生的答卷。請你計算並返回該考場可以容納的一起參加考試且無法作弊的最大學生人數。

學生必須坐在狀況良好的座位上。

示例 1:

輸入:seats = [["#",".","#","#",".","#"],

[".","#","#","#","#","."],

["#",".","#","#",".","#"]]

輸出:4

解釋:教師可以讓 4 個學生坐在可用的座位上,這樣他們就無法在考試中作弊。 

題解:狀態壓縮每一行的狀態["#",".","#","#",".","#"]可以為二進位制的010010即十進位制18。

每行的總狀態數則為2^n-1

構造dp陣列dp[i][j]表示第i行狀態為j時的最大人數,如果狀態j不合法(判斷方法如下)則人數定為0。

如何判斷某狀態的合理性:如果坐人的位置是壞的則直接不合理。若某行的狀態為i,將i左右移一位分別與i且運算,存在一側大於0則不合理。

如何判斷某狀態結合上一行狀態的合理性:同理,如果坐人的位置是壞的則直接不合理。若某行的狀態為i,上一行為j,將i左右移一位分別與j且運算,存在一側大於0則不合理。

很容易的可以得到狀態轉移方法,給出偽**如下:

if j狀態不合理:

dp[i][j] = 0

return

max = 0

for k in 0..2^n-1:

if j與上一行k匹配合理 && dp[i-1][k]大於max:

max = dp[i-1][k]

dp[i][j] = max

以下是全部**:dp可以優化為一維陣列,降低空間複雜度。

// 計算input狀態的人數

int getsize(int input)

return output;

}// 錯位判斷合理性

bool iswrong(int a, int b)

// dp[i][j] 第i行為j狀態時的最大人數

int maxstudents(vector> &seats)

state[i] = temp;

}for (int i = 0; i < nn; ++i)

dp[0][i] = getsize(i);

}for (int i = 1; i < m; ++i)

int tt = getsize(j);

int r = 0;

for (int k = 0; k < nn; ++k)

if (t > r) r = t;

}dp[i][j] = r + tt;}}

int output = 0;

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

return output;

}

LeetCode 1349 參加考試的最大學生數

每乙個位置與 左 右 左上 右上有關係,所每一行與上一行有關係。使用動態規劃,dp 行 座位安排 列舉兩行的座位安排,然後判斷是否合法,合法的話上一行的數量加上本行的數量。class solution if i 1seat,int state for int row 1 rowdp row stat...

大學生參加Python培訓班有什麼好處

首先,報名培訓班學習可以掌握更加前沿的技術。it行業中,技術在不斷更新變化,不斷更新迭代,當我們在大學學習的知識很難以滿足社會的用人需求,但是很多python培訓班,都是針對性開設課程,培養專業技術領域人才,讓大家就業更有優勢。其次,參加培訓更加容易就業,大學生就業一直都是社會熱點話題,對剛剛畢業的...

寫給迷茫的大學生

問題是肯定的 因為工廠時刻都需要人手,你只需要人到,一小時教會你,之後上班就行。那你告訴我,你大學三年不是白讀了?你是不是經常在寢室玩電腦 經常在網咖打遊戲 經常看些沒有任何水平的電子書 經常追動漫,電視劇集。那好,你現在應該可以去面試工廠工人了,你偏偏去面試開發,人家面試官是瞎還是聾?會要你?我知...