給定乙個如下的二維陣列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...