【動態規劃】Vijos P1011 清帝之惑之順治
阿新 • • 發佈:2019-02-02
題目連結:
題目大意:
給一張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[]={-1,1,0,0}; int dy[]={0,0,-1,1}; 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=1;i<=n;i++) { for(j=1;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+1,a+1+n*m,cmp); for(i=1;i<=n*m;i++) { nowx=a[i].x; nowy=a[i].y; for(j=0;j<4;j++) { xx=nowx+dx[j]; yy=nowy+dy[j]; if(xx>0 && xx<=n && yy>0 && yy<=m) { if(mm[xx][yy]<mm[nowx][nowy]) d[nowx][nowy]=max(d[nowx][nowy],d[xx][yy]+1); } } ans=max(d[nowx][nowy],ans); } printf("%d\n",ans+1); } return 0; } /* // // */