poj1088简单dp+递归

中文题目就不多说题目意思了

需要注意的是这里的行和列,我就是在这个地方死了好几次

然后就是不知道从哪里开始才是起点,所以要把每一个点都搜一遍


#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;

int a[110][110]={0};
int dp[110][100]={0};
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
int r,c;

int deal(int n,int m)
{
    if(dp[n][m])
        return dp[n][m];

    int tempans=0;
    for(int i=0;i<4;i++){
        int tempy=n+dy[i];
        int tempx=m+dx[i];
        if(tempx<=0||tempy<=0||tempy>r||tempx>c)
            continue;
        if(a[n][m]>a[tempy][tempx])
            tempans=max(tempans,deal(tempy,tempx));
    }

    return dp[n][m]=tempans+1;
}

int main()
{
    while(scanf("%d%d",&r,&c)!=EOF)
    {
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
            scanf("%d",&a[i][j]);

        int ans=0;
        for(int i=1;i<=r;i++){
            for(int j=1;j<=c;j++){
                dp[i][j]=deal(i,j);
                ans=dp[i][j]>ans?dp[i][j]:ans;
            }
        }

        printf("%d\n",ans);


    }


    return 0;
}


你可能感兴趣的:(poj1088简单dp+递归)