动态规划方法:
dp[i][j]表示以matrix[i][j]为结尾的最长递增序列
struct myData{
int x;
int y;
int data;
};
bool cmp(const myData& myData1, const myData& myData2){
return myData1.data < myData2.data;
}
class Solution {
public:
int longestIncreasingPath(vector<vector<int>>& matrix) {
int row = matrix.size();
if(row == 0){
return 0;
}
int clum = matrix[0].size();
if(clum == 0 ){
return 0;
}
vector<myData> vec;
myData temp;
for(int i = 0; i < row; i++){
for(int j = 0; j < clum; j++){
temp.x = i;
temp.y = j;
temp.data = matrix[i][j];
vec.push_back(temp);
}
}
sort(vec.begin(), vec.end(), cmp);
int dp[row][clum];
memset(dp, -1, sizeof(int)*row*clum);
int iout = 0;
vector<myData>::iterator ite = vec.begin();
for(int i = 0; i < row * clum; i++, ite++){
int ix = ite -> x;
int iy = ite -> y;
int idata = ite -> data;
int imaxnum = 0;
if(ix - 1 >= 0 && dp[ix - 1][iy] > imaxnum && idata > matrix[ix - 1][iy]){
imaxnum = dp[ix - 1][iy];
}
if(ix + 1 < row && dp[ix + 1][iy] > imaxnum && idata > matrix[ix + 1][iy]){
imaxnum = dp[ix + 1][iy];
}
if(iy - 1 >= 0 && dp[ix][iy - 1] > imaxnum && idata > matrix[ix][iy - 1]){
imaxnum = dp[ix][iy - 1];
}
if(iy + 1 < clum && dp[ix][iy + 1] > imaxnum && idata > matrix[ix][iy + 1]){
imaxnum = dp[ix][iy + 1];
}
dp[ix][iy] = imaxnum + 1;
if(iout < imaxnum + 1){
iout = imaxnum + 1;
}
}
return iout;
}
};