今天不bb了,直接帖原題吧 位址》
<<
香穗子在田野上調蘑菇!她跳啊跳,發現自己很無聊,於是她想了乙個有趣的事情,每個格仔最多只能經過1次,且每個格仔都有其價值這是二維dp樣板,是dp中的豪傑,相較普通dp,思路和順序也有些變化.跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格仔,並且她只能往價值更高(這裡是嚴格的大於)的格仔跳.
香穗子可以從任意的格仔出發,在任意的格仔結束,
那麼她最多能跳幾次?
輸入格式:
第一行n,m,表示田野的長和寬
接下來n行,每行m個數,表示該格的價值
輸出格式:
乙個數,表示最多跳得次數
輸入樣例#1:
2 22 5-1 3
輸出樣例#1:
2n,m<=100
這題裡,搜尋函式是核心內容,建立數學模型也是比較重要(洛谷題解中有多種模型,構建不同也導致他們後續主函式運算部分難易不一,但其實不關鍵,能寫出來就夠了)
下面是我構建的搜尋函式(瘋狂膜洛谷題解大佬):
int sgs(int i,intj)
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次,且每個格仔都有其價值 跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格仔,並且她只能往價值更高 這裡是嚴格的大於 的格仔跳.香穗子可以從任意的格仔出發,在任意的格仔結束,那...