滑雪那道题变了一下,结果就跑到bzoj里面了
这数据范围也是感人。。
直接记忆化搜索,对于改变的值直接修改就可以了
在字符读入的时候卡了半天QAQ,还是需要用字符数组,毕竟它遇到空格就停下
1 #include2 #include 3 #include 4 using namespace std; 5 int num[705][705],f[705][705]; 6 bool available[705][705]; 7 int n,m; 8 int fx[4]={ 0,0,1,-1}; 9 int fy[4]={ 1,-1,0,0};10 11 int search(int x,int y){12 if (f[x][y]!=-1) return f[x][y];13 int tmp=1;14 for (int i=0;i<4;i++){15 if (available[x+fx[i]][y+fy[i]]&&num[x][y]>num[x+fx[i]][y+fy[i]])16 tmp=max(tmp,search(x+fx[i],y+fy[i])+1);17 }18 f[x][y]=tmp;19 return tmp;20 }21 22 int main(){23 memset(num,-1,sizeof(num));24 memset(available,0,sizeof(available));25 scanf("%d",&n);26 for (int i=1;i<=n;i++)27 for (int j=1;j<=n;j++){28 scanf("%d",&num[i][j]);29 available[i][j]=1;30 } 31 scanf("%d",&m);32 char c[2];33 int x,y,z,u;34 for (int t=1;t<=m;t++){35 scanf("%s",c);36 if (c[0]=='C') {37 scanf("%d%d%d",&x,&y,&z);38 num[x][y]=z;39 }40 if (c[0]=='S'){41 scanf("%d%d%d%d",&x,&y,&z,&u);42 for (int i=x;i<=z;i++)43 for (int j=y;j<=u;j++)44 available[i][j]=0;45 }46 if (c[0]=='B'){47 scanf("%d%d%d%d",&x,&y,&z,&u);48 for (int i=x;i<=z;i++)49 for (int j=y;j<=u;j++)50 available[i][j]=1;51 }52 //int time=0;53 if (c[0]=='Q') {54 //printf("%d\n",++time);55 memset(f,-1,sizeof(f));56 int Ans=1;57 for (int i=1;i<=n;i++)58 for (int j=1;j<=n;j++){59 if (!available[i][j]) continue;60 Ans=max(Ans,search(i,j));61 }62 printf("%d\n",Ans);63 }64 }65 return 0;66 }