跟hdu的那道老鼠吃东西的很像,但是,所不同的是,这道题的起点没有预先跟你说,我一开始用了整个数组的最大值作为起始点,错了,后来发现如果这个数组中有很多相同的最大值的话,运行起来就会错,所以我干脆全部搜索,每个数值都有成为起点的机会——ACCEPT
#include "iostream" #include "string.h" using namespace std; int p[4][2]={{1,0},{0,-1},{-1,0},{0,1}}; int num[110][110],mark[110][110],maxb=0,n,m; int dfs(int x,int y){ int max=0,i; if(mark[x][y]==1){ for(i=0;i<4;i++){ int xx=x+p[i][0]; int yy=y+p[i][1]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&num[x][y]>num[xx][yy]){ //cout<<"xx "<<xx<<" yy "<<yy<<" num "<<num[xx][yy]<<endl; int ans=dfs(xx,yy); max=max>ans?max:ans; } } mark[x][y]=max+1; } //cout<<"maxb "<<maxb<<endl; maxb=maxb>mark[x][y]?maxb:mark[x][y]; return mark[x][y]; } int main(){ int i,j,x,y,data=0; cin>>n>>m; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ cin>>num[i][j]; mark[i][j]=1; if(data<num[i][j]){ data=num[i][j];x=i;y=j; } } } //cout<<"x "<<x<<" y "<<y<<endl; //cout<<mark[x][y]<<endl; for(i=1;i<=n;i++) for(j=1;j<=m;j++)dfs(i,j); cout<<maxb<<endl; }