标签:
题目链接:http://poj.org/problem?id=1088
Memory: 372KTime: 16MSLanguage: C++Result: Accepted
解题报告:
1、d[i][j]表示maps[i][j]所能达到的最长长度
2、状态转移方程
d[i][j]=max(d[i][j]四周的d[x][y])+1;
3、由于,如果没有将d[i][j]求出来是不可能将d[x][y]求出来的,所以这里需要将maps排序,才能DP
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; #define MAX 105 int row,col,len; int maps[MAX][MAX];//存表格 int mov[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int d[MAX][MAX];//d[i][j]表示maps[i][j]所能到达的最长长度 int ans; struct Node{ int x,y; int value;//海拔 }node[MAX*MAX]; bool operator <(const Node a,const Node b) { return a.value<b.value; } void DP() { ans=0; memset(d,0,sizeof(d)); for(int i=0;i<len;i++) { int x=node[i].x; int y=node[i].y; for(int j=0;j<4;j++) { int tx=x+mov[j][0]; int ty=y+mov[j][1]; if(tx>=0&&tx<row&&ty>=0&&ty<col) { if(maps[x][y]>maps[tx][ty]) { d[x][y]=max(d[x][y],d[tx][ty]+1); } } ans=max(ans,d[x][y]); } } } int main() { scanf("%d%d",&row,&col); len=0; for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { scanf("%d",&maps[i][j]); node[len].x=i; node[len].y=j; node[len++].value=maps[i][j]; } } sort(node,node+len); DP(); printf("%d\n",ans+1); return 0; }
标签:
原文地址:http://www.cnblogs.com/TreeDream/p/5212089.html