您的位置:首页 > 其它

POJ 1088 滑雪(dp)

2014-05-07 07:20 316 查看
题目:
http://poj.org/problem?id=1088
题意:

寻找一个二维数组中最长递减序列的长度

题解:

动态规划,dp()函数求以[i,j]为起始的最优解,函数内调用自身判断4个方向里满足条件的局部最优解,可解。

代码:

#include<stdio.h>
#include<string>
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(~scanf("%d%d",&N,&M))
{
int answer=0;
int i,j;
for(i=1;i<=N;i++)
{
for(j=1;j<=M;j++)
{
scanf("%d",&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]);//更新整体最优解
}
}
printf("%d\n",answer);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: