BZOJ3208: 花神的秒題計劃Ⅰ
阿新 • • 發佈:2019-01-01
BZOJ3208: 花神的秒題計劃Ⅰ
https://lydsy.com/JudgeOnline/problem.php?id=3208
分析:
- 暴力模擬,每次詢問記憶化搜尋。
程式碼:
#include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <set> #include <vector> #include <cmath> using namespace std; typedef long long ll; #define N 750 int a[N][N],n,m,c[N][N],b[N][N]; char opt[10]; int f[N][N]; int tx[]={0,1,0,-1}; int ty[]={1,0,-1,0}; int dp(int x,int y) { if(b[x][y]>0) return 0; if(f[x][y]!=-1) return f[x][y]; f[x][y]=0; int i; for(i=0;i<4;i++) { int dx=x+tx[i], dy=y+ty[i]; if(dx>=1&&dx<=n&&dy>=1&&dy<=n&&a[dx][dy]<a[x][y]) { f[x][y]=max(f[x][y],dp(dx,dy)); } } f[x][y]++; return f[x][y]; } int main() { scanf("%d",&n); int i,j,x,y,z,w; for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]); int m; scanf("%d",&m); while(m--) { scanf("%s",opt+1); if(opt[1]=='C') { scanf("%d%d%d",&x,&y,&z); a[x][y]=z; }else if(opt[1]=='S') { scanf("%d%d%d%d",&x,&y,&z,&w); for(i=x;i<=z;i++) for(j=y;j<=w;j++) b[i][j]=1; }else if(opt[1]=='B') { scanf("%d%d%d%d",&x,&y,&z,&w); for(i=x;i<=z;i++) for(j=y;j<=w;j++) b[i][j]=0; }else { for(i=1;i<=n;i++)for(j=1;j<=n;j++)f[i][j]=-1; int ans=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { ans=max(ans,dp(i,j)); } printf("%d\n",ans); } } }