| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
还是超时,我已经记忆化搜索了,代码附上#include <cstdlib>
#include <iostream>
#include <stdio.h>
using namespace std;
int map[105][105];
int len[105][105];//最大高度
int dir[4][2]={
1,0,
0,-1,
-1,0,
0,1
} ;//四方向数组
int m,n;//行,列
int i,j;//深搜坐标点
void find(int x,int y,int h){//x,y为当前坐标,h为当前点的高度
++h;
if(h>len[i][j])
len[i][j]=h;
int tx,ty;
for(int k=0;k<4;++k){
tx=x+dir[k][0];
ty=y+dir[k][1];
if(tx>=0&&tx<m)//行越界判断
if(ty>=0&&ty<n)//列越界判断
if(map[x][y]>map[tx][ty]){
// cout<<h<<'\t'<<ti<<'\t'<<tj<<'\t'<<map[ti][tj]<<endl;
if(tx<i&&ty<j){//这个点已经搜过了
len[i][j]=h+len[tx][ty]>len[i][j]?h+len[tx][ty]:len[i][j];//如果当前点高度加之前高度大于最大高度 则赋值
continue;
}//dp
find(tx,ty,h);// 将下一点作为当前点递归调用
}//当前点高度是否比周围点高
}
--h;
}
int main(int argc, char *argv[])
{
int max;//全地图最大高度
scanf("%d %d",&m,&n);
while(m!=0&&n!=0){
max=0;
for(i=0;i<m;++i)
for(j=0;j<n;++j){
scanf("%d",&map[i][j]);//输入地图
}
for(i=0;i<m;++i)
for(j=0;j<n;++j){
find(i,j,0);//深搜
if(max<len[i][j])
max=len[i][j];//求全地图最大高度
}
printf("%d\n",max);
scanf("%d %d",&m,&n);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator