滑雪(百练1088) (dp+dfs)
2016-02-05 17:34
309 查看
解题思路
L(i,j)表示从点(i,j)出发的最长滑行长度。 一个点(i,j), 如果周围没有比它低的点,L(i,j) = 1
否则
递推公式: L(i,j) 等于(i,j)周围四个点中,比(i,j)低,且L值最大的那个点 的L值,再加1
转移方程很容易想到,但是我没想到的是需要结合dfs,我又不会dfs(什么都不会),所以一道很简单的水题都做不出来,看题解的时候有一步不是很懂,就是按高度从小到大排序,想不明白为什么,但是dp+dfs时不需要排序,所以不知道排序的方法怎么做的,而且排序的复杂度为n^2,但是dp+dfs应该不是n^2,要比n^2大一点,所以还待需弄懂。
我写的很挫,所以看别人的代码时很难看懂。。。。wuwu~~~
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 105
int dp
,n,m,a
;
//dp[i][j]表示的是以a[i][j]为开始的最长路径,
//表示以a[i][j]为结尾的最长路径也可以,只需dfs稍微改变一下符号
int dfs(int i,int j)
{
if(dp[i][j]>0)
return dp[i][j];
dp[i][j]=1;
if(i-1>=1&&a[i][j]>a[i-1][j])
dp[i][j]=max(dfs(i-1,j)+1,dp[i][j]);
if(j-1>=1&&a[i][j]>a[i][j-1])
dp[i][j]=max(dp[i][j],dfs(i,j-1)+1);
if(i+1<=n&&a[i][j]>a[i+1][j])
dp[i][j]=max(dp[i][j],dfs(i+1,j)+1);
if(j+1<=m&&a[i][j]>a[i][j+1])
dp[i][j]=max(dp[i][j],dfs(i,j+1)+1);
return dp[i][j];
}
int main()
{
int maxn=0,i,j;
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
cin>>a[i][j];
}
for( i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
maxn=max(dfs(i,j),maxn);
}
}
cout<<maxn<<endl;
return 0;
}
L(i,j)表示从点(i,j)出发的最长滑行长度。 一个点(i,j), 如果周围没有比它低的点,L(i,j) = 1
否则
递推公式: L(i,j) 等于(i,j)周围四个点中,比(i,j)低,且L值最大的那个点 的L值,再加1
转移方程很容易想到,但是我没想到的是需要结合dfs,我又不会dfs(什么都不会),所以一道很简单的水题都做不出来,看题解的时候有一步不是很懂,就是按高度从小到大排序,想不明白为什么,但是dp+dfs时不需要排序,所以不知道排序的方法怎么做的,而且排序的复杂度为n^2,但是dp+dfs应该不是n^2,要比n^2大一点,所以还待需弄懂。
我写的很挫,所以看别人的代码时很难看懂。。。。wuwu~~~
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 105
int dp
,n,m,a
;
//dp[i][j]表示的是以a[i][j]为开始的最长路径,
//表示以a[i][j]为结尾的最长路径也可以,只需dfs稍微改变一下符号
int dfs(int i,int j)
{
if(dp[i][j]>0)
return dp[i][j];
dp[i][j]=1;
if(i-1>=1&&a[i][j]>a[i-1][j])
dp[i][j]=max(dfs(i-1,j)+1,dp[i][j]);
if(j-1>=1&&a[i][j]>a[i][j-1])
dp[i][j]=max(dp[i][j],dfs(i,j-1)+1);
if(i+1<=n&&a[i][j]>a[i+1][j])
dp[i][j]=max(dp[i][j],dfs(i+1,j)+1);
if(j+1<=m&&a[i][j]>a[i][j+1])
dp[i][j]=max(dp[i][j],dfs(i,j+1)+1);
return dp[i][j];
}
int main()
{
int maxn=0,i,j;
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
cin>>a[i][j];
}
for( i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
maxn=max(dfs(i,j),maxn);
}
}
cout<<maxn<<endl;
return 0;
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- LFC1.0.0 版本发布
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- android中像素单位dp、px、pt、sp的比较
- C 语言实现迷宫 DFS算法
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- 一幅图弄清DFT与DTFT,DFS的关系