zoukankan      html  css  js  c++  java
  • BZOJ-3208|记忆化搜索-花神的秒题计划Ⅰ

    背景【backboard】:

    Memphis等一群蒟蒻出题中,花神凑过来秒题……

    描述【discribe】:

    花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目。

    我们可以把风景区看作一个nn的地图,每个点有它的初始高度,滑雪只能从高处往低处滑【严格大于】。但是由于地势经常变动【比如雪崩、滑坡】,高度经常变化;同时,政府政策规定对于每个区域都要间歇地进行保护,防止环境破坏。现在,滑雪项目的要求是给出每个nn个点的初始高度,并给出m个命令,C a b c表示坐标为a,b的点的高度改为c;S a b c d表示左上角为a,b右下角为c,d的矩形地区开始进行保护,即不能继续滑雪;B a b c d表示左上角为a b,右下角为c d的矩形地区取消保护,即可以开始滑雪;Q表示询问现在该风景区可以滑雪的最长路径为多少。对于每个Q要作一次回答。

    花神一看,这不是超简单!立刻秒出了标算~

    Input

    第一行n,第二行开始n*n的地图,意义如上;接下来一个m,然后是m个命令,如上

    Output

    对于每一个Q输出单独一行的回答

    Sample Input 1

    5

    1 2 3 4 5

    10 9 8 7 6

    11 12 13 14 15

    20 19 18 17 16

    21 22 23 24 25

    5

    C 1 1 3

    Q

    S 1 3 5 5

    S 3 1 5 5

    Q

    Sample Output 1

    24

    3

    样例解释:

    第一个Q路线为:25->24->23->22….->3->2

    第二个Q的路线为:10->9->2

    记忆化搜索

    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    
    /*
    std::ios_base::sync_with_stdio;也超时 
    */
    
    const int inf = 0x3f3f3f3f;
    const int maxn = 1010;
    int n;
    int f[maxn][maxn];
    int g[maxn][maxn];
    int vis[maxn][maxn];
    int dr[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};
    
    bool in(int x,int y){
    	return x>0 && x<=n && y>0 && y<=n;
    }
    
    //f[x][y]含义:从这个点出发 所能走的最大长度 
    
    int dfs(int x,int y){
    	if(vis[x][y]) return -inf; 
    	if(f[x][y]) return f[x][y]; //取
    	int res = 1;//第一次搜索这个点
    	for(int i=0;i<4;i++){
    		int tx = x + dr[i][0];
    		int ty = y + dr[i][1];
    		if(in(tx,ty) && g[tx][ty] < g[x][y]){
    			res = max(res,dfs(tx,ty)+1);
    		}
    	}
    	return f[x][y] = res; //存 
    }
    
    
    int main(){
    	std::ios_base::sync_with_stdio;
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			cin>>g[i][j];
    		}
    	}
    	int m;
    	cin>>m;
    	while(m--){
    		char ch;
    		int a,b,c,d;
    		cin>>ch;
    		if(ch=='S'){
    			cin>>a>>b>>c>>d;
    			for(int i=a;i<=c;i++){
    				for(int j=b;j<=d;j++){
    					vis[i][j] = 1;
    				}
    			}
    		}else if(ch=='B'){
    			cin>>a>>b>>c>>d;
    			for(int i=a;i<=c;i++){
    				for(int j=b;j<=d;j++){
    					vis[i][j] = 0;
    				}
    			}	
    		}else if(ch=='C'){
    			cin>>a>>b>>c;
    			g[a][b] = c;
    		}else{
    			int ans = 0;
    			memset(f,0,sizeof(f));
    			for(int i=1;i<=n;i++){
    				for(int j=1;j<=n;j++){
    					ans = max(ans,dfs(i,j));
    				}
    			} 
    			cout<<ans<<endl;
    		}
    	}
    	return 0;
    } 
    
  • 相关阅读:
    文章块引用模版
    悬停工具提示
    各个知识点
    Github Fork 缎带.html
    css重置样式
    暗灰色的圆形按钮.html
    css中的居中的方法
    display:table的几个用法 块级子元素垂直居中
    <meta>标签中http-equiv属性的属性值X-UA-Compatible详解
    jQuery难学是因为什么?
  • 原文地址:https://www.cnblogs.com/fisherss/p/10737112.html
Copyright © 2011-2022 走看看