poj 1088 动态规划

#include <iostream>
#include <string.h>
using namespace std;

int ans[101][101];//存储当前位置能得到的最优解
int map[101][101];//存储当前位置的元素值
int dir[4][2]={1,0,0,1,-1,0,0,-1};//四个方向,右,上,左,下
int N,M;
int max(int a,int b)
{
    return a>b?a:b;
}
int dp(int i,int j)//得到[i,j]位置的最优解
{
    if(ans[i][j]>0) return ans[i][j];
    //寻找四个方向的局部满足要求的最优解
    int t,tempi,tempj;
    int maxn=0;
    for(t=0;t<4;t++)
    {
        tempi=i+dir[t][0];
        tempj=j+dir[t][1];
        if(tempi>0&&tempi<=N&&tempj>0&&tempj<=M) //不可越界
        {
            if(map[tempi][tempj]<map[i][j])//低于[i,j]
                maxn=max(maxn,dp(tempi,tempj));
        }
    }
    return ans[i][j]=maxn+1;
}
int main()
{
    while(cin >>N >> M)
    {
        int answer=0;
        int i,j;
        for(i=1;i<=N;i++)
        {
            for(j=1;j<=M;j++)
            {
                cin >> map[i][j];
            }
        }
        memset(ans,0,sizeof(ans));
        for(i=1;i<=N;i++)
        {
            for(j=1;j<=M;j++)
            {
                ans[i][j]=dp(i,j);//得到[i,j]位置的最优解
                answer=max(answer,ans[i][j]);//更新整体最优解
            }
        }
        cout << answer;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/lipenglin/p/4386414.html