n,m = map(int,input().split())
mp=[]
vis=[[0]*(m+1) for i in range(n+1)]#记忆化搜索
for i in range(n):
mp.append(list(map(int,input().split())))
dir = [(-1,0),(1,0),(0,1),(0,-1)]
def dfs(x,y):#返回对于x,y这点的最长距离
if vis[x][y]!=0: return vis[x][y]#vis数组!=0说明已经被记录过了
res=1
for u,v in dir:
nx,ny=x+u,y+v
if 0<=nx<n and 0<=ny<m and mp[nx][ny]<mp[x][y]:
res=max(res,dfs(nx,ny)+1)#dfs(nx,ny)加上(x,y)这点
vis[x][y] =res
return vis[x][y]
ans=0
for i in range(n):
for j in range(m):
ans = max(ans,dfs(i,j))
print(ans)
枚举--最长单词--蓝桥杯
编写一个函数,输入一行字符,将此字符串中最长的单词输出。
输入仅一行,多个单词,每个单词间用一个空格隔开。单词仅由小写字母组成。所有单词的长度和不超过100000。如有多个最长单词,输出最先出现的。
样例输入
I am a student
样例输出
student
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[100000];
int j;
int t;
int c;
int max=0;
int i=0;
int k=0;
j=0;
gets(a);
//printf("%s",a);
k=strlen(a);
//cout<<k;
for(i=0;i<k;i++)
{
if(a[i]==‘ ‘||i==k-1)
{
c=i-j;
j=i+1;
if(c>max)
{
max=c;
t=i;
}
}
}
for(int x=t-max;x<=t;x++)
{
cout<<a[x];
}
cout<<endl;
return 0;
}