求二維整數陣列中最長的遞減數字串(滑雪演算法)

2021-06-25 18:05:12 字數 1747 閱讀 1795

給定乙個m行n列的整數陣列,求解該陣列中最長的遞減數字串。數字串只能由相鄰的數字連線獲得。比如陣列a為

[1 2 3 4

8 7 6 5

6 5 4 2]

a[1][1]==7, 則連線在a[1][1]之後數字只可能是a[0][1],a[1][2],a[2][1]。a中最長的遞減數字串為8,7,6,5,4,3,2,1。

這是前幾天在某網路公司筆試時碰到的一道題目。當時只想出了解題思路,沒時間寫**。現在把思路和後來寫的**跟大家分享一下。

或許大家都遇到過讓你求解一維整數陣列中最長的連續遞減子字串的問題。與一維陣列中的問題一樣,該問題也是乙個動態規劃問題。

假設最終求得的最長遞減數字串為a[i1][j1]->a[i2][j2]->...a[ik][jk],長度為k。可以證明以a[i2][j2]為最大數字的遞減數字串長度必然為k-1,而形式為

a[i2][j2]->a[i3][j3]->...a[ik][jk]。否則,必然可以找到乙個長度大於k的以a[i1][j1]開頭的數字串。因此可以先確定以a[i][j]周圍的數字a[i-1][j],a[i+1][j],a[i][j-1],

a[i][j+1]中比a[i][j]小的數為第乙個數字的最長數字串,然後從中選擇長度最長的乙個數字串,如以a[i-1][j]開頭的最長遞減數字串。再將a[i][j]加在以a[i-1][j]開頭的

最長遞減數字串的前面,從而得到以a[i][j]為起始數字的最長遞減數字串。求解以a[i][j]為首數字的最長遞減數字串問題,可以通過先求解以a[i-1][j],a[i+1][j],a[i][j-1],

a[i][j+1]中比a[i][j]小的數為第乙個數字的最長數字串這一子問題,再將a[i][j]新增到子問題求解中得到的最長的遞減數字串的前面,從而得到最終解。該問題符合

動態規劃問題的兩大特徵,即通過合併最優子問題得到問題的解和子問題的求解存在重疊。

下面是解決該問題的基本思路。建立兩個陣列length,path。length[i][j],path[i][j]分別記錄以a[i][j]為首數字的最長遞減數字串的長度和該最長遞減數字串下乙個

數字的位置。path[i][j]的取值為0,1,2,3,-1,分別表示最長遞減數字串的下乙個數字在path[i][j]的上方,下方,左方,右方,不存在下乙個數字。由於以任意的a[i][j]

為首數字的最長遞減數字串的長度和下乙個數字位置只求解一次,因此該解法的時間複雜度為o(mn)。**如下所示

#includeusing namespace std;

int row, col;

void find(int **a, int row, int col);

void dfs(int **a, int i, int j, int **length, int **path);

int main()

for(int i=0; i>a[i][j];

cout}

} do

else

temp[0]=-1;

if(i=a[i+1][j])

else

temp[1]=-1;

if(j>0 && a[i][j]>=a[i][j-1])

else

temp[2]=-1;

if(j=a[i][j+1])

else

temp[3]=-1;

for(int idx_i=0; idx_i<4; idx_i++)

}} if(length[i][j]==0)

length[i][j]=1;

}

二維整數陣列中最大聯通子陣列的和

實驗要求 結對開發 陶雨潔,李慧 一 兩人合作中的過程 1.設計思路 1 上課時,老師已經開了個頭 要找二維整數陣列中的最大聯通子陣列的和,首先,所有正數加起來肯定是最大的,這就轉換成所有正數是否聯通的問題。2 對於所有正數是否聯通的問題,則再定義乙個相同行數和列數的二維陣列b,來標記原陣列a的變化...

二維陣列中的最長遞減子串行

給定乙個如下的二維陣列a 1 3 5 7 4 2 1 8 6 5 4 0 1 2 6 求其中的最長遞減子串行 7,5,3,1,0,1,2,長度為7。子串行只能朝向上下左右四個方向,不能朝對角線方向。思路 該題一看感覺可以用動態規劃做,但是下標不確定從 開始算起,因為有上下左右四個方向,沒有辦法順序計...

返回乙個二維整數陣列中最大子陣列的和

作業要求 1 輸入乙個二維整形陣列,陣列裡有正數有負數。2 二維陣列中連續的乙個子矩陣組成乙個子陣列。3 求所有子陣列的和的最大值。設計思想 1 將二維陣列分解成一維陣列,使用一位陣列求最大子陣列之和的方法。2 列舉出每乙個子陣列值的大小,然後進行比較。3 最終求得二維陣列最大子陣列之和。出現的問題...