zoukankan      html  css  js  c++  java
  • 3.滑雪-深搜&dp

    //Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
    // 1  2  3  4 5
    //16 17 18 19 6
    //15 24 25 20 7
    //14 23 22 21 8
    //13 12 11 10 9
    //一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
    //
    //输入描述
    //
    //输入的第一行表示区域的行数R和列数C(1<=R,C<=100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
    //
    //
    //输出描述
    //
    //输出最长区域的长度。
    //
    //
    //输入样例
    //
    //5 5
    //1 2 3 4 5
    //16 17 18 19 6
    //15 24 25 20 7
    //14 23 22 21 8
    //13 12 11 10 9
    //
    //
    //输出样例
    //
    //25


    #include <iostream>
    using namespace std;

    int m, n;
    int a[105][105];  //符合题意即可,不要太大,否则耗时太多
    int dp[105][105];
    int count = 0;

    int valid(int x, int y){
        return (x >= 0 && x <= m && y >= 0 && y <= n);
    }

    int dfs(int x, int y){
        if(dp[x][y] != -1)   //不为-1表示已经搜索过,直接取,避免重复搜索耗时
            return dp[x][y];
        int all = 0;
        if(valid(x, y) && a[x][y] >= a[x - 1][y])
            all = max(all, 1 + dfs(x-1, y));
        if(valid(x, y) && a[x][y] >= a[x + 1][y])
            all = max(all, 1 + dfs(x + 1, y));
        if(valid(x, y) && a[x][y] >= a[x][y - 1])
            all = max(all, 1 + dfs(x, y - 1));
        if(valid(x, y) && a[x][y] >= a[x][y + 1])
            all = max(all, 1 + dfs(x, y + 1));
        if(all == 0)
            return 1;
        else{
            return all;
        }
    }

    int main(){
        int max = 0;
        cin >> m >> n;
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++){
                cin >> a[i][j];
                dp[i][j] = -1;  //初始化为-1
            }
        
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++){
    //            max = dfs(i, j);
                if(max < dfs(i, j))
                    max = dfs(i, j);
            }
        cout << max;
        return 0;
    }

    #include <iostream>
    #include <cstring>
    using namespace std;
    int dp[104][104];
    int a[104][104]; 
    int r, c;
    int dx[4] = {0, 0, -1, 1};
    int dy[4] = {1, -1, 0, 0};
    
    int longest(int i, int j){
    	if(dp[i][j]){
    		return dp[i][j];
    	}
    	int m = 0, ri, rj;
    	for(int k = 0; k < 4; k++){
    		 ri = i + dx[k];
    		 rj = j + dy[k];
    		if(ri >= 0 && ri < r && rj >= 0 && rj < c && a[ri][rj] > a[i][j]){
    			if(m < longest(ri, rj))
    				m = longest(ri, rj);
    		}
    	}
    	return dp[i][j] = m + 1;
    }
    
    int main(){
    		int t;
    	cin >> t;
    	while(t--){
    //		int r, c;
    		memset(dp, 0, sizeof(dp));
    		cin >> r >> c;
    		for(int i = 0; i < r; i++){
    			for(int j = 0; j < c; j++)
    				cin >> a[i][j];
    		}
    		int ma = 0, ret;
    		for(int i = 0; i < r; i++){
    			for(int j = 0; j < c; j++){
    				ret = longest(i, j);
    				if(ma < ret)
    					ma = ret;
    			}
    		}
    		cout << ma << endl;
    	}
    
    	
    	
    	
    	return 0;
    }
    

      

  • 相关阅读:
    增量+全量备份SVN服务器
    日常小命令集锦
    filebeat输出到kafka
    在Logstash的配置文件中对日志事件进行区分
    NFS服务器简易安装
    记录一次MySQL数据库CPU负载异常高的问题
    使用Spring的jdbcTemplate进一步简化JDBC操作
    Stream 和 byte[] 之间的转换
    C# 文件转byte数组,byte数组再转换文件
    groupbox里面添加Form
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7284475.html
Copyright © 2011-2022 走看看