[bzoj3208]花神的秒题计划I

滑雪那道题变了一下,结果就跑到bzoj里面了

这数据范围也是感人。。

直接记忆化搜索,对于改变的值直接修改就可以了

在字符读入的时候卡了半天QAQ,还是需要用字符数组,毕竟它遇到空格就停下

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 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
",++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
",Ans);
63     }
64   }
65   return 0;
66 }
View Code
原文地址:https://www.cnblogs.com/vincent-hwh/p/6061383.html