POJ 1088 DP=记忆化搜索

话说DP=记忆化搜索这句话真不是虚的。

面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦!

通过对四个方向进行搜索,即可得到当前状态的最优解。

#include <iostream>
#include <cstdio>
using namespace std;
int date[105][105];
int dp[105][105];
int dir[][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int r,c;
int dpac(int i,int j)
{
    if (dp[i][j]>1) return dp[i][j];
    for (int k=0; k<4; k++)
    {
        int nr=i+dir[k][0];
        int nc=j+dir[k][1];
        if (nr<1||nc<1||nr>r||nc>c) continue;
        if (date[i][j]>date[nr][nc])
        {
           dp[nr][nc]=dpac(nr,nc);
           dp[i][j]=max(dp[nr][nc]+1,dp[i][j]);
        }

    }
    return dp[i][j];
}
int main()
{

    while (scanf("%d %d",&r,&c)!=EOF)
    {
        int i,j,k,p;
        for (i=1; i<=r; i++)
        {
            for (j=1; j<=c; j++)
            {
                scanf("%d",&date[i][j]);
                dp[i][j]=1;
            }
        }
        int ans=0;
        for (i=1; i<=r; i++)
        {
            for (j=1; j<=c; j++)
            {
                int temp=dpac(i,j);
                if (ans<temp) ans=temp;
            }
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/kkrisen/p/3335638.html