题意 输入一个城市的滑雪地图 你可以从高的地方滑到伤下左右低的地方
求这个城市的最长滑雪线路长度 即在一个矩阵中找出最长递减连续序列
令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;
}