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/archive/2012/11/05/2755932.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值