题目:http://poj.org/problem?id=1088
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 84530 | Accepted: 31645 |
Description
1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
Input
Output
Sample Input
5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
Sample Output
25分析:最开始单纯用DFS做,呵呵,超时。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[105][105],b[105][105]; int r,c; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; void dfs(int x,int y,int sum){ for(int i=0;i<4;i++){ int ix=x+dir[i][0],iy=y+dir[i][1]; if(ix>=0&&ix<r&&iy>=0&&iy<c&&a[x][y]>a[ix][iy]) dfs(ix,iy,sum+1); } b[x][y]=max(b[x][y],sum); } int main() { //freopen("cin.txt","r",stdin); while(cin>>r>>c){ for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ scanf("%d",&a[i][j]); b[i][j]=0; } } for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ dfs(i,j,1); } } int ans=0; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ ans=max(ans,b[i][j]); } } printf("%d\n",ans); } return 0; }
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[105][105],b[105][105],r,c; bool vis[105][105]; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int ans; void dfs(int x,int y,int sum){ if(vis[x][y]) { ans=max(ans,sum); return ; } for(int i=0;i<4;i++){ int ix=x+dir[i][0],iy=y+dir[i][1]; if(ix>=0&&ix<r&&iy>=0&&iy<c&&a[x][y]>a[ix][iy]) dfs(ix,iy,sum+b[ix][iy]); } ans=max(ans,sum); } int main() { //freopen("cin.txt","r",stdin); while(cin>>r>>c){ for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ scanf("%d",&a[i][j]); b[i][j]=1; vis[i][j]=0; } } int res=0; for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ ans=0; dfs(i,j,1); vis[i][j]=1; b[i][j]=ans; res=max(res,b[i][j]); } } printf("%d\n",res); } return 0; }