洛谷p1732 活蹦亂跳的香穗子 二維DP

2022-05-01 12:39:09 字數 1610 閱讀 8595

今天不bb了,直接帖原題吧  位址》

<<

香穗子在田野上調蘑菇!她跳啊跳,發現自己很無聊,於是她想了乙個有趣的事情,每個格仔最多只能經過1次,且每個格仔都有其價值

跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格仔,並且她只能往價值更高(這裡是嚴格的大於)的格仔跳.

香穗子可以從任意的格仔出發,在任意的格仔結束,

那麼她最多能跳幾次?

輸入格式:

第一行n,m,表示田野的長和寬

接下來n行,每行m個數,表示該格的價值

輸出格式:

乙個數,表示最多跳得次數

輸入樣例#1:

2 2

2 5-1 3

輸出樣例#1:

2

n,m<=100

這是二維dp樣板,是dp中的豪傑,相較普通dp,思路和順序也有些變化.

這題裡,搜尋函式是核心內容,建立數學模型也是比較重要(洛谷題解中有多種模型,構建不同也導致他們後續主函式運算部分難易不一,但其實不關鍵,能寫出來就夠了)

下面是我構建的搜尋函式(瘋狂膜洛谷題解大佬):

int sgs(int i,int

j)

if(j+1

<=m&&map[i][j+1]if(i+1

<=n&&map[i+1][j]if(j-1>=1&&map[i][j-1]if(k==0) a[i][j]=0

;

return

a[i][j];

}

其中map是儲存地圖數字的陣列,a是儲存"跳到這個格仔的最大次數",對每乙個點map[i,j]討論跳到這個點所需的最大步數,再在主函式中forfor遍歷全圖就可以找到答案.

函式的查詢方法是對該點的上下左右詢問,看是否有比該點數字小的點,如果有比他小的(即可從那個點跳到該點),就拿a[i,j]和a[那個點]+1來取最大值.

其中值得注意的一行:

if(a[i][j]!=-1) returna[i][j];

-1是在主函式中輸入資料是賦值的.意為"未被詢問的",被詢問後就會有值(比大於0),依次區分,如果沒有這行,那程式的執行會慢好多哦~~~

以下是ac**:

#includeusing namespace std;

int max(int a,int b)

int map[101][101],a[101][101];

int n,m;

int sgs(int i,int j)

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

for(j=1;j<=m;j++)

way=max(way,sgs(i,j));

cout<注意邊界的判斷哦~(比心)

P1732 活蹦亂跳的香穗子

香穗子在田野上調蘑菇 她跳啊跳,發現自己很無聊,於是她想了乙個有趣的事情,每個格仔最多只能經過1次,且每個格仔都有其價值 跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格仔,並且她只能往價值更高 這裡是嚴格的大於 的格仔跳.香穗子可以從任意的格仔出發,在任意的格仔結束,那麼她最多能跳幾次?...

活蹦亂跳的希爾排序 4

希爾排序演算法是突破這個時間負責度 o n 2n 2 n2 的第一批演算法之一。之前的直接插入排序,應該說,它的效率在某些時候是很高的,比如,我們的記錄本身就是基本有序的,我們只需要少量的插入操作,就可以完成整個記錄集的排序工作,此時直接插入很高效。還有就是記錄數比較少時,直接插入的優勢也比較明顯。...

記憶化搜尋 活蹦亂跳的香穗子

活蹦亂跳的香穗子 香穗子在田野上調蘑菇 她跳啊跳,發現自己很無聊,於是她想了乙個有趣的事情,每個格仔最多只能經過1次,且每個格仔都有其價值 跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格仔,並且她只能往價值更高 這裡是嚴格的大於 的格仔跳.香穗子可以從任意的格仔出發,在任意的格仔結束,那...