做题一定要看数据范围。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 750 #define maxm 1000050 using namespace std; int n,m,a,b,c,d,dp[maxn][maxn],h[maxn][maxn],ans=0; int dx[]={0,-1,1,0,0},dy[]={0,0,0,-1,1}; bool vis[maxn][maxn]; char s[10]; bool judge(int x,int y) { return (x>=1 && x<=n && y>=1 && y<=n); } int get_dp(int x,int y) { if (dp[x][y]) return dp[x][y]; vis[x][y]=dp[x][y]=1; for (int i=1;i<=4;i++) { int tx=x+dx[i],ty=y+dy[i]; if (judge(tx,ty) && !vis[tx][ty] && h[tx][ty]>h[x][y]) dp[x][y]=max(dp[x][y],get_dp(tx,ty)+1); } vis[x][y]=0;return dp[x][y]; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) scanf("%d",&h[i][j]); scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%s",s); if (s[0]=='C') {scanf("%d%d%d",&a,&b,&c);h[a][b]=c;} else if (s[0]=='S' || s[0]=='B') { scanf("%d%d%d%d",&a,&b,&c,&d); for (int i=a;i<=c;i++) for (int j=b;j<=d;j++) vis[i][j]=(s[0]=='S'); } else { memset(dp,0,sizeof(dp));ans=0; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (!vis[i][j]) ans=max(ans,get_dp(i,j)); printf("%d\n",ans); } } }