這裡給出啟發式的題解和比較簡單的做法。(**五十行)
題意:在乙個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...