给定一个如下的二维数组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 <iostream>
#include <assert.h>
using namespace std;
int Max(int a, int b, int c, int d)
{
a = (a > b) ?