题目链接:http://poj.org/problem?id=1088
看到题目第一眼感觉--woc,好简单!再看一下时间1000ms,瞬间萎了...orz
直接宽搜BFS绝对超时啊(。﹏。*)
还好朋友XJW来了一波安利
思路:自定义结构体,二维数组转一维,权值为坡度,记录每个权值对应的坐标,从小到大权值排序,再用DP就可以换过了。
代码很清晰的表达了以上思路:
/*
name:Rollchuchy
type:dp+bfs
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int maze[105][105];
struct node
{
int x,y,v;
}s[105*105];
bool cmp(node x1,node x2)
{
return x1.v<x2.v;
}
int dp[105][105];/*1000ms->BS什么的去死吧*/
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main()
{
//freopen("in.txt","r",stdin);
int r,c;
cin>>r>>c;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cin>>maze[i][j];
dp[i][j]=1;/*初始值*/
s[i*c+j].x=i;
s[i*c+j].y=j;
s[i*c+j].v=maze[i][j];
}
}
sort(s,s+r*c,cmp);
int ans=0;
for(int i=0;i<r*c;i++)
{
int nx=s[i].x,ny=s[i].y;
for(int j=0;j<4;j++)
{
int tx=nx+dx[j];
int ty=ny+dy[j];
if(tx<0||ty<0||tx>=r||ty>=c) continue;
if(maze[tx][ty]>maze[nx][ny])
dp[tx][ty]=max(dp[nx][ny]+1,dp[tx][ty]);
}
ans=max(ans,dp[nx][ny]);
}
cout<<ans<<endl;
return 0;
}