题目大意:
给你一个矩阵,当做滑雪场,矩阵的每个单元中的数代表高度,滑雪者只能从高的滑到低的地方,且方向只能是上,下,左和右,问滑雪者最长能滑几个单元?
解题思路:
该题本质上就是求矩阵上的最长严格连续递减(或递增)序列,即序列中的元素不能相等,而且前后之间必须相邻。该题属于动态规划问题,要用到递归。
已找递减序列为例,设dp[i][j]表示第i,j点所构成的序列有多长,求这个值,只需要对其上,下,左和右四个方向进行比较就可以,设board表示题目给的矩阵,dfs( i , j )表示求第i,j个点构成的序列长度,则可以得到
若board[i][j] > board[i-1][j], 则dp[i][j] = dp[i-1][j] + 1, 而dp[i-1][j]可以用递归求出,则状态转移方程为:
dp[i][j] = dfs( i-1 , j ) + 1;
但是还不够,要对board[i][j]四个方向都计算一遍,取最大的,所以使用
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, -1, 0, 1 };
然后进行一次循环,取出最大的值赋给dp[i][j],所以最终的状态转移方程为:
temp = max( temp, dfs( i + dx[k], j + dy[k] ) + 1 );
代码:
#include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; int dp[105][105], board[105][105]; int dfs( int i, int j ); int main() { freopen( "test.txt", "r", stdin ); int T, m, n; char name[50]; cin>>T; while( T-- ) { memset( dp, -1, sizeof( dp ) ); memset( board, 1, sizeof( board ) ); cin>>name>>m>>n; for( int i = 1; i <= m; i++ ) { for( int j = 1; j <= n; j++ ) { cin>>board[i][j]; } } int ans = 0; for( int i = 1; i <= m; i++ ) { for( int j = 1; j <= n; j++ ) { ans = max( ans, dfs( i, j ) ); } } cout<<name<<": "<<ans<<endl; } return 0; } int dx[4] = { -1, 0, 1, 0 }; int dy[4] = { 0, -1, 0, 1 }; int dfs( int i, int j ) { if( dp[i][j] >= 0 ) return dp[i][j]; int temp = 1; for( int k = 0; k < 4; k++ ) { if( board[i + dx[k]][j + dy[k]] < board[i][j] ) temp = max( temp, dfs( i + dx[k], j + dy[k] ) + 1 ); } return (dp[i][j] = temp); }
相关推荐
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Java AC 版本
Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with...
LMS Longest Monotonically Increasing Sequence Algorithm
java java_leetcode题解之Longest Increasing Path in a Matrix.java
北大POJ2533-Longest Ordered Subsequence【O(nlogn)】
这是动态规划中,求最长公共子序列(Longest common string)的源代码。自己编写执行。程序简单,有注释。
Assume that it is a nonpreemptive scheduling: once a job is started, it must run to completion. The following is an instance. (j1, j2, j3, j4) : (15,8,3,10) Single-source shortest paths. The ...
【Longest Common Ancestor (LCA)问题】是图论中的一个重要概念,特别是在树结构的处理中。给定树T中的两个节点u和v,LCA指的是离根节点最远的公共祖先,即同时是u和v祖先的那个节点。解决LCA问题可以转化为求解...
Pku acm 第2533题 Longest Ordered Subsequence 代码,有详细的注释,动态规划
最长公共子序列(Longest Common Subsequence, LCS)问题是计算机科学领域中一个重要的经典问题,它不仅被广泛应用于文本比较、生物信息学中的基因序列比对等领域,而且也是动态规划算法的一个典型应用场景。...
printf("The length of the longest ordered subsequence is: %d\n", longestOrderedSubsequence(nums, numsSize)); return 0; } ``` 在上面的C程序中,我们首先定义了动态规划数组`dp`,然后通过两层循环来填充...
c语言入门 c语言_leetcode题解之1372_longest_zigzag_path_in_a_binary_tree
标题“POJ2533-Longest Ordered Subsequence”是指北京大学在线判题系统POJ上的一道编程题目,其核心任务是寻找一个序列中最长的有序子序列。描述中的“解题报告+AC代码”表明这个压缩包包含了对这道问题的解答思路...
数据结构问题:“最长回文子串问题”(Longest Palindromic Substring),详细解法和代码实现; 数据结构问题:“最长回文子串问题”(Longest Palindromic Substring),详细解法和代码实现; 数据结构问题:“最长...
Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with...
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. ...
LCS(longest common substring)算法,即最大公共子串,它是求两个字符串最长公共子串的问题。大体解法是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长...
java java_leetcode题解之Longest Substring Without Repeating
java java_leetcode题解之Longest Valid Parentheses.java
java java_leetcode题解之Longest Turbulent Subarray.java