poj 1088

来源:互联网 发布:视频剪辑合成配音软件 编辑:程序博客网 时间:2024/06/07 00:57

代码写的很挫

记忆化搜索,对搜过的点不在进行搜索,回溯过程中得出dp[i][j]的值

#include<iostream>#include<cstring>using namespace std; int n,m;int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};int a[1000][1000];int dp[1000][1000];int dfs(int x,int y){    int i,j,k;    if(dp[x][y]>0)        return dp[x][y];    int xx=x+dir[0][0];    int yy=y+dir[0][1];    if(xx<=n&&yy<=m&&xx>=1&&yy>=1)    {        if(a[x][y]>a[xx][yy])        (dp[x][y]=max(dp[x][y],dfs(xx,yy)));    }    xx=x+dir[1][0];    yy=y+dir[1][1];    if(xx<=n&&yy<=m&&xx>=1&&yy>=1)    {        if(a[x][y]>a[xx][yy])        (dp[x][y]=max(dp[x][y],dfs(xx,yy)));     }    xx=x+dir[2][0];    yy=y+dir[2][1];    if(xx<=n&&yy<=m&&xx>=1&&yy>=1)    {    if(a[x][y]>a[xx][yy])         (dp[x][y]=max(dp[x][y],dfs(xx,yy)));    }    xx=x+dir[3][0];    yy=y+dir[3][1];    if(xx<=n&&yy<=m&&xx>=1&&yy>=1)    {            if(a[x][y]>a[xx][yy])                 (dp[x][y]=max(dp[x][y], dfs(xx,yy)));    }    dp[x][y]=dp[x][y]+1;    return dp[x][y];}int main(){    while(cin>>n>>m)    {    memset(a,0,sizeof(a));    int i,j,k;    int maxx=-1;    for(i=1;i<=n;i++)        for(j=1;j<=m;j++)        {            cin>>a[i][j];        }    memset(dp,0,sizeof(dp));    for(i=1;i<=n;i++)        for(j=1;j<=m;j++)        {            dp[i][j]=dfs(i,j);        }    maxx=0;    for(i=1;i<=n;++i)    {        for(j=1;j<=m;j++)            if(maxx<dp[i][j])            {                maxx=dp[i][j];            }    }    cout<<maxx<<endl;    }}


0 0
原创粉丝点击