做的第一道DP问题的题, 思路来源于网上, 感觉这个思路蛮好的... (http://www.cppblog.com/abilitytao/archive/2009/02/19/74271.aspx) #include <iostream> #include <cstdio> #include <algorithm> using namespace std; #define MAX_COUNT 101 #define MAX 20000 typedef struct _NODE { int x; int y; int h; _NODE() { x = 0; y = 0; h = 0; } _NODE & operator=(const _NODE &node) { x = node.x; y = node.y; h = node.h; return *this; } bool operator<(_NODE &node) { return h < node.h; } }NODE; int main() { //freopen("input.txt", "rt", stdin); int hight[MAX_COUNT][MAX_COUNT] = {{0, 0}}; int len[MAX_COUNT][MAX_COUNT] = {{0, 0}}; NODE node[MAX]; int max = 0; int R, C; scanf("%d%d", &R, &C); int i = 0, j = 0, index = 0; for(; i<R; i++) { for(j=0; j<C; j++) { scanf("%d", &hight[i][j]); node[index].x = i; node[index].y = j; node[index].h = hight[i][j]; index++; } } sort(&node[0], node + R * C); for(i=0; i<R * C; i++) { if(hight[node[i].x][node[i].y] < hight[node[i].x][node[i].y + 1] && len[node[i].x][node[i].y] >= len[node[i].x][node[i].y + 1]) len[node[i].x][node[i].y + 1] = len[node[i].x][node[i].y] + 1; if(hight[node[i].x][node[i].y] < hight[node[i].x + 1][node[i].y] && len[node[i].x][node[i].y] >= len[node[i].x + 1][node[i].y]) len[node[i].x + 1][node[i].y] = len[node[i].x][node[i].y] + 1; if(hight[node[i].x][node[i].y] < hight[node[i].x][node[i].y - 1] && len[node[i].x][node[i].y] >= len[node[i].x][node[i].y - 1]) len[node[i].x][node[i].y - 1] = len[node[i].x][node[i].y] + 1; if(hight[node[i].x][node[i].y] < hight[node[i].x - 1][node[i].y] && len[node[i].x][node[i].y] >= len[node[i].x - 1][node[i].y]) len[node[i].x - 1][node[i].y] = len[node[i].x][node[i].y] + 1; } for(i=0; i<R; i++) { for(j=0; j<C; j++) if(len[i][j] > max) max = len[i][j]; } printf("%d/n", max + 1); return 0; }