POJ 1088 滑雪

来源:互联网 发布:马云网络 编辑:程序博客网 时间:2024/06/07 22:03

这道题可以拿搜索做,不过我觉得DP更省点时间,也好理解,多开了一点点内存空间。

记录所有的点的信息,按高度排序,然后再依照高度去找点,标记在一个二维数组里,并记录其中最大的权值。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[105][105],dp[105][105];struct point{    int i,j;    int h;};point b[10002];bool cmp(point x,point y){    return x.h<y.h;}int main(){    int n,m,i,j,k,I,J,M;    while(~scanf("%d%d",&n,&m))    {        k=0;        for(i=0; i<=101; i++)        {            for(j=0;j<=101;j++)            a[i][j]=10002;        }        for(i=1; i<=n; i++)        {            for(j=1; j<=m; j++)            {                scanf("%d",&a[i][j]);                b[k].h=a[i][j];                b[k].i=i;                b[k].j=j;                k++;            }        }        sort(b,b+k, cmp);        memset(dp,0,sizeof(dp));        M=0;        for(i=0; i<k; i++)        {            I=b[i].i,J=b[i].j;            if(a[I+1][J]<a[I][J]&&dp[I][J]<dp[I+1][J]+1)                dp[I][J]=dp[I+1][J]+1;            if(a[I][J+1]<a[I][J]&&dp[I][J]<dp[I][J+1]+1)                dp[I][J]=dp[I][J+1]+1;            if(a[I-1][J]<a[I][J]&&dp[I][J]<dp[I-1][J]+1)                dp[I][J]=dp[I-1][J]+1;            if(a[I][J-1]<a[I][J]&&dp[I][J]<dp[I][J-1]+1)                dp[I][J]=dp[I][J-1]+1;            if(dp[I][J]>M)                M=dp[I][J];        }        printf("%d\n",M+1);    }    return 0;}


0 0
原创粉丝点击