poj 1088

初入dp界,好悲催,应该好好地做些动规的题了,

用的是 记忆化搜索的方法,就是另开一个数组用来记录 处理过得数据,

最后再搜索数组找到结果,不过对于我来说,怎么找这个循环节确实是个难题,从此要多锻炼了

#include<iostream>
#include<cstdio>
using namespace std;
int map[105][105];
int f[][2]={{1,0},{0,1},{-1,0},{0,-1}};//搜索上下左右四个方向
int vis[105][105] ;//用来储存处理过的对应坐标的数据
int m , n ;
int dp ( int x , int y )
{
if ( vis[x][y] > 0 )
return vis[x][y] ;
int i ;
int sum = 1 ;//如果数据都相同,则走一次到达,所以sum应该是1;
for ( i = 0 ; i < 4 ; i ++ )
{
int a = x + f[i][0] ;
int b = y + f[i][1] ;
if(a >= 1 && a <= m && b >=1 && b <= n)
{
if(map[a][b] < map[x][y])
sum = max ( sum , dp ( a , b ) + 1 ) ;//如果满足在数组范围中,且比原始坐标小,则进行下一次搜索,走的步奏同时加一;
}

}
vis[x][y] = sum ;把这个坐标找到的最大步奏储存在标记数组的相同位置中
return sum ;
}
int main()
{
int sum = 0;
cin>>m>>n;
int i , j ;
for ( i = 1 ; i <= m ; i ++ )
for ( j = 1 ; j <= n ; j ++ )
cin >> map [i][j] ;
for ( i = 1 ; i <= m ; i ++ )
{
for ( j = 1 ; j <= n ; j ++ )
sum = max ( sum , dp ( i , j ) ) ;
}

cout << sum << endl ;
}

原文地址:https://www.cnblogs.com/lfyy/p/2755932.html