uva 10285 最长的滑雪路径

来源:互联网 发布:淘宝给商家结算的周期 编辑:程序博客网 时间:2024/06/06 02:18

题意  输入一个城市的滑雪地图  你可以从高的地方滑到伤下左右低的地方

  求这个城市的最长滑雪线路长度   即一个矩阵中找出最长递减连续序列

令d[i][j]为以格子map(i,j)为起点的最长序列   

则有状态转移方程d[i][j]=max{d[a][b]}+1  

a,b为与i,j相邻且值比i,j小的所有点

#include"cstdio"#include"cstdlib"#include"cstring"#include"climits"#include"queue"#include"algorithm"#include"iostream"using namespace std;int m,n,answer=1;int a[110][110],ans[110][110];int work(int x,int y){int i,j,k,nx,ny;if(ans[x][y]>0)return ans[x][y];ans[x][y]=1;for(i=-1;i<=1;i++)for(j=-1;j<=1;j++)if(i*j==0&&x+i<=m&&x+i>=1&&y+j<=n&&y+j>=1&&a[x+i][y+j]<a[x][y]&&work(x+i,y+j)+1>ans[x][y])ans[x][y]=ans[x+i][y+j]+1;return ans[x][y];}int main(){// freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);int i,j,k;int T;cin>>T;while(T--){string s;cin>>s;answer=1;scanf("%d%d",&m,&n);for(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&a[i][j]);memset(ans,-1,sizeof ans);for(i=1;i<=m;i++)for(j=1;j<=n;j++){int temp=work(i,j);if(answer<temp)answer=temp;}cout<<s<<": "<<answer<<endl;}return 0;}


0 0
原创粉丝点击