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

2021-06-17 23:46:00 字數 1373 閱讀 7690

給定乙個如下的二維陣列a

1   3   5   7   4

2   1   8   6   5

4   0  -1  -2   6

求其中的最長遞減子串行:7, 5, 3, 1, 0, -1, -2,長度為7。子串行只能朝向上下左右四個方向,不能朝對角線方向。

思路:該題一看感覺可以用動態規劃做,但是下標不確定從**開始算起,因為有上下左右四個方向,沒有辦法順序計算。只有用遞迴的方法來做。用乙個函式findmax(i, j)來表示以該位置起始的最長遞減子串行的長度,那麼只要取findmax(i-1, j)、findmax(i+1, j)、findmax(i, j-1)、findmax(i, j+1)中的最大值,然後加1即可,當然前提是上下左右的元素比(i, j)的元素小。

**如下:

#include #include using namespace std;

int max(int a, int b, int c, int d)

int findmax(int a, int res, bool flag, int m, int n, int i, int j)

//如果上面元素的標記為true,說明已經計算過,直接取結果

else

umax = res[up];

} //下面的元素

int down = (i + 1) * n + j;

if (i < m-1 && a[cur] > a[down])

else

dmax = res[down];

} //左邊的元素

int left = i * n + j - 1;

if (j > 0 && a[cur] > a[left])

else

lmax = res[left];

} //右邊的元素

int right = i * n + j + 1;

if (j < n-1 && a[cur] > a[right])

else

rmax = res[right];

} //當上下左右元素的值都計算完,就可以計算當前元素的最長路徑了

flag[cur] = true;

res[cur] = 1 + max(umax, dmax, lmax, rmax);

return res[cur];

}int lds(int a, int m, int n)

} delete res;

delete flag;

return max;

}void main()

; int m = 5, n = 5;

cout << lds(a, m, n) << endl;

}

CUMTOJ 求陣列的最長遞減子串行

給定乙個整數序列,輸出它的最長遞減 注意不是 不遞增 子串行。輸入包括兩行,第一行包括乙個正整數n n 1000 表示輸入的整數序列的長度。第二行包括用空格分隔開的n個整數,整數範圍區間為 30000,30000 輸出最長遞減子串行,數字之間有乙個空格。8 9 4 3 2 5 4 3 29 5 4 ...

最長上公升子串行 滑雪(二維)

michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長底滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...

動態規劃 陣列中最長遞減子串行

求乙個陣列的最長遞減子串行比如的最長遞減子串行為 分析 典型的動態規劃題目,對每乙個數計算由它開始的最大遞減子串行的個數,並存放到一張對映表中。例如對陣列a n 有 然後利用求得的對映表及最大子串行個數獲取原陣列中的元素。對於我們求得最大子串行個數為nmaxlen 5,表為ptable 那麼ptab...