题目链接:

  https://vijos.org/p/1011

题目大意

  给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方。问最长能走多少格。

题目思路:

  【动态规划】

  这题就是滑雪,动态规划。

  将高度排序后从低往高算,当前高度所在的格子上下左右比当前高度低就可以用来更新答案。

 //
//by coolxxx
//
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) (a)*(a)
#define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
#define eps 1e-8
#define J 10000
#define MAX 0x7f7f7f7f
#define PI 3.1415926535897
#define N 504
#define M 500004
using namespace std;
int n,m,lll,ans,cas;
struct xxx
{
int map,x,y;
}a[N*N];
int mm[N][N],d[N][N];
int xx,yy,nowx,nowy;
int dx[]={-,,,};
int dy[]={,,-,};
bool cmp(xxx aa,xxx bb)
{
return aa.map<bb.map;
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
// while(~scanf("%s%d",s,&n))
while(~scanf("%d",&n) && n)
{
scanf("%d",&m);
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf("%d",&a[i*m-m+j].map);
mm[i][j]=a[i*m-m+j].map;
a[i*m+j-m].x=i;
a[i*m-m+j].y=j;
}
}
sort(a+,a++n*m,cmp);
for(i=;i<=n*m;i++)
{
nowx=a[i].x;
nowy=a[i].y;
for(j=;j<;j++)
{
xx=nowx+dx[j];
yy=nowy+dy[j];
if(xx> && xx<=n && yy> && yy<=m)
{
if(mm[xx][yy]<mm[nowx][nowy])
d[nowx][nowy]=max(d[nowx][nowy],d[xx][yy]+);
}
}
ans=max(d[nowx][nowy],ans);
}
printf("%d\n",ans+);
}
return ;
} /*
// //
*/
04-26 17:23
查看更多