SCAU 10687 東方迷宮

2021-10-04 16:54:01 字數 1981 閱讀 9241

這裡給出啟發式的題解和比較簡單的做法。(**五十行)

題意:在乙個n*n的網格中,每個網格上有乙個值(1~9),網格之間可能有板子,即相鄰兩格仔可能不互通,從左上角走到右下角,找出一條最短路,其路上總權值最大。

你可以在紙上畫一畫,你會發現,如果你想走出最短路,只能向右或者向下,也就是不能回頭。想到這一步,就可以很容易

做出這道題了(才怪)。考慮一下,當前格仔,只能向下或者向右,變一下思路,也就是當前格仔只能由上或者左的格仔走來。

動態規劃四個大字已經呼之欲出了(bfs也可以但我覺得dp比較帥)

當前格仔最大值=max(上面的格仔最大值,左邊的格仔最大值)+當前格仔的初始值a[i][j];

即dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];

方程出來了,僅僅是開始,我們還要尋找轉移條件。

根據題意,兩個格仔之間互通的條件是兩個格仔之間沒有板子。

嗯,那麼在dp的時候加上這樣的判定就好了。

嗯?你覺得結束了?

不不不(我當時就以為這樣結束了,wa得很慘)。

兩個格仔之間互通,不代表走最短路的時候可以互通。

比如:2|3 4 5 6

6 7 2 3 1

這樣乙個圖,(0,0)右邊有乙個板子,因為最短路的關係,所以(0,0)右邊一行都不能走,推dp的時候也不能由這些點得來。

也就是說我們還要加乙個標記,v[i][j],表示這個點是否能夠探索到,1為可以,0為不行,初始設v[1][1]=1。

到這裡思路部分真正完結了。但是你可能還有疑問?如何處理板子?

2.處理

某黃姓老師曾說過,優秀大學生最喜歡暴力。

仔細想一下,相鄰的兩個點,他們的x或y座標必定有乙個相等。

那麼我們可以減少一維,開兩個陣列,dy[i][j-1][j]表示第i行的j-1與j兩個格仔有板子,dx[j][i-1][i]同理。

其實優化到這一步已經可以做題了,但我們不滿於此,仔細思考一下,相鄰兩點除了一維座標相等,另一維其實只相差1,處於乙個線性的關係

我們完全可以再去掉一維座標,用dy[i][j]表示第i行的j-1與j之間的互通情況,dx[j][i]同理。

實話說,相對於其他幾個題解,我對自己的處理方法很滿意。

壓縮到這裡,我已經滿足了,有爽到。

下面給出**。

#include

#include

#include

using

namespace std;

int g[

111]

[111

],v[

111]

[111

],dx[

111]

[111

],dy[

111]

[111

],dp[

111]

[111];

intmain()

scanf

("%c"

,&aaa);}

cin >> m ;

for(i=

1;i<=m;

++i)

for(i=

1;i<=n;

++i)

if(j-

1>

0&&dy[i]

[j]==

0&&v[i]

[j-1])

}}printf

("case %d: %d\n"

,t,dp[n]

[n])

;++t;

}return0;

}

SCAU巡邏的士兵

有n個士兵站成一佇列,現在需要選擇幾個士兵派去偵察。為了選擇合適的士兵,多次進行如下操作 如果佇列超過三個士兵,那麼去除掉所有站立位置為奇數的士兵,或者是去除掉所有站立位置為偶數的士兵。直到不超過三個戰士,他們將被送去偵察。現要求統計按這樣的方法,總共可能有多少種不同的正好三個士兵去偵察的士兵組合方...

SCAU 8610 順序查詢

時間限制 1000ms 長度限制 10kb 提交次數 2303 通過次數 1423 題型 程式設計題 語言 g gcc description 編寫search seq函式,實現在乙個無序表st中採用順序查詢演算法查詢值為key的元素的演算法.include malloc.h malloc 等 in...

SCAU 8580 合併鍊錶

8580 合併鍊錶 時間限制 1000ms 長度限制 10kb 提交次數 3724 通過次數 2077 題型 程式設計題 語言 g gcc description 線性鍊錶的基本操作如下 include include define error 0 define ok 1 define elemty...