滑雪
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 75626 | Accepted: 28028 |
难得一见的中文题 题意就不多做解释 求最长路径
简单点的动规 唯一的麻烦就是没告诉你起点和终点 没关系 直接一个个暴搜反正数据不大。。。
转移方程 dp[ i ] [ j ]=max( dp[ i-1 ] [ j ] ,dp[ i ] [ j-1 ] ,dp[ i+1 ] [ j ] ,dp [ i ] [ j+1 ] )
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int dp[105][105];
int map[105][105],vis[105][105];
int col,row,ans;
int search(int x,int y)
{
int sum,xx,yy,maxn=0;
if(dp[x][y])
return dp[x][y];
for(int i=0;i<4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if(xx>=0&&xx<row&&yy>=0&&yy<col&&map[xx][yy]<map[x][y])
{
sum=search(xx,yy);
if(maxn<sum)
maxn=sum;
}
}
return maxn+1;
}
int main()
{
int i,j;
while(~scanf("%d%d",&row,&col))
{
for(i=0;i<row;i++)
for(j=0;j<col;j++)
scanf("%d",&map[i][j]);
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
dp[i][j]=search(i,j);
if(dp[i][j]>ans)
ans=dp[i][j];
}
/* for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}*/
cout<<ans<<endl;
}
return 0;
}