思路:这是我做的第二道二维数组的动态规划,所以很清楚的知道二维的动态规划递归方程是用dp[][]而不是dp[],所为很容易得到递归公式:dp[i][j]=max(dp[i-1][j],dp[i+1][j],dp[i][j-1],dp[i][j+1]).(在满足条件的情况下),那么我们用个递归函数,里面分别判断(i-1,j)(i+1,j)(i,j-1)(i,j+1)等四个方向是否满足条件(不越界,并且值小于位置(i,j)上的值).然后在主函数中依次遍历每个点,每个点调用递归函数得到以这个点为起点可以得到的最大路径,然后我们从每个点的最大路径中再选最大的一个,其值+1即为answer。
但是这样会有个问题,那就是会超时,那我们怎样缩短时间呢?我们知道动态规划的思想是以空间换时间,利用其它子问题已经求出的结果,那么看我们这道题,一个点走过一遍就可以得到它的最大路径,那么对于走过的点我们是可以不用再走而直接利用答案的,所以我们用个标记数组,记录走过的点就OK了。
代码如下:
#include<iostream> using namespace std; #define len 110 int m,n; int dp[len][len]; int vis[len][len]; int judge(int i,int j) { if(i>=0&&i<m&&j>=0&&j<n) return 1; return 0; } int setdp(int a[len][len],int i,int j) { if (vis[i][j]==1) { return dp[i][j]; } vis[i][j]=1; int t; if(judge(i-1,j)&&a[i][j]>a[i-1][j]) { t=setdp(a,i-1,j)+1; if(dp[i][j]<t) dp[i][j]=t; } if(judge(i+1,j)&&a[i][j]>a[i+1][j]) { t=setdp(a,i+1,j)+1; if(dp[i][j]<t) dp[i][j]=t; } if(judge(i,j-1)&&a[i][j]>a[i][j-1]) { t=setdp(a,i,j-1)+1; if(dp[i][j]<t) dp[i][j]=t; } if(judge(i,j+1)&&a[i][j]>a[i][j+1]) { t=setdp(a,i,j+1)+1; if(dp[i][j]<t) dp[i][j]=t; } return dp[i][j]; } int main() { scanf("%d",&m); scanf("%d",&n); int a[len][len]; int i,j; int max; memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(i=0;i<m;i++) for(j=0;j<n;j++) { scanf("%d",&a[i][j]); } for(i=0;i<m;i++) for(j=0;j<n;j++) { setdp(a,i,j); } max=0; for(i=0;i<m;i++) for(j=0;j<n;j++) { if(max<dp[i][j]) max=dp[i][j]; } printf("%d\n",max+1); return 0; }
相关推荐
标题中的“动态规划算法poj1088滑雪实验报告”指的是使用动态规划算法解决北京大学ICPC在线测评系统POJ中编号为1088的滑雪问题。这个问题旨在通过一个直观的应用实例,帮助学习者深入理解动态规划的概念,并熟练运用...
在POJ 2029这个题目中,我们可能面临的问题是需要对一个二维矩阵进行动态更新和求和查询,例如计算某一个矩形区域内的元素总和。 二维树状数组的基本思想是将二维空间转化为一维存储,通常是通过行优先或列优先的...
在本篇中,我们将深入学习二维树状数组的应用,并通过解决POJ 1195问题来实践这一概念。 POJ 1195题目要求我们计算一个二维矩阵中的子矩阵之和。这正是二维树状数组的优势所在,因为我们可以快速地对矩阵的任意矩形...
这是一道经典的动态规划问题,涉及到二维数组的处理。题目要求找到一个二叉树中从叶子节点到根节点的最大路径和。动态规划策略是从底层叶子节点开始,向上层节点递归计算每个节点的最大路径和。关键在于维护一个二...
这道题目通常被归类为计算机科学与信息技术领域的算法问题,特别是涉及数据结构和动态规划的子领域。 【描述】该题目的解题报告详细介绍了如何解决这个问题。通常解题报告会包含以下几个部分:问题分析、算法设计、...
#### 二维动态规划 - **题目示例**: - POJ 1191、POJ 1054:基于矩阵的状态转移方程。 - POJ 3280、POJ 2029:多维状态空间的探索。 #### 递归动态规划 - **题目示例**: - POJ 2948、POJ 1925:递归动态规划的...
3. **二维动态规划**: - (poj3176, poj1080, poj1159):多维状态转移方程的应用。 ### 五、组合数学 1. **排列组合基础**: - 排列、组合的计算方法。 2. **多项式与快速幂**: - 多项式的运算规则以及快速幂...
在这个问题中,我们可以定义一个二维数组dp[i][j]表示前i个文件用j台碎纸机处理的最短时间。 2. **状态转移方程**:状态转移方程是动态规划的核心,描述了如何从一个状态转移到另一个状态。对于此题,可能的状态...
例如,可能会有一个二维数组用于存储状态,以及一系列的for循环来实现状态转移。同时,代码可能还包括输入处理、输出格式化等功能。 为了深入理解这个问题,我们需要查看代码的具体实现,包括变量定义、函数设计...
可能涉及到二维空间中的距离公式、KDTree(K-d树)或其他空间索引数据结构。 4. **POJ 1459--improved more.txt**:这可能是一个需要优化的算法题目,解题报告会对比不同的解决方案,并讨论如何通过改进算法提高...
3714题作为一道几何问题,可能需要考生理解二维空间中的几何对象交互,如碰撞检测、轨迹分析等。在解决此类问题时,考生可能需要利用数学知识,比如线性代数、解析几何等,同时要熟练运用编程语言,如C++,来实现...
2. 1050 To the Max:求解最大值问题,可能需要构建一个二维数组来存储子问题的解。 3. 1125 Stockbroker Grapevine:涉及股票交易策略,需要考虑时间序列上的决策。 4. 1141 Brackets Sequence:与括号匹配相关,...
在C++中,可以使用二维动态数组或`std::vector<std::vector<int>>`来实现。 2. **深度优先搜索(DFS)**:一种常见的解决数独问题的算法是深度优先搜索。从第一个空白单元格开始,尝试填充1到9的数字,如果在某一步...
1. **动态规划**:此题可能涉及到动态规划的思想,动态规划是一种解决最优化问题的常用方法,通常用于处理具有重叠子问题和最优子结构的问题。在这种情况下,可能需要建立一个二维数组来存储子问题的解,然后通过...
POJ根据题目的特点将其分为多个类别,包括但不限于基础算法、数据结构、搜索算法、动态规划等。每个类别下面又细分了许多具体的子类别。这种细致的分类方式有助于初学者快速定位到自己感兴趣或者需要加强的部分进行...
* 较为复杂的动态规划:POJ1191、POJ1054、POJ3280、POJ2029、POJ2948、POJ1925、POJ3034 * 记录状态的动态规划:POJ3254、POJ2411、POJ1185 * 树型动态规划:POJ2057、POJ1947、POJ2486、POJ3140 五、计算几何学 ...
通过建立一个二维数组来表示问题的约束,然后使用回溯法逐步构造解。 4. poj1201 "Sieve"(筛法) 题目要求计算一定范围内的素数。这可以通过埃拉托斯特尼筛法(Sieve of Eratosthenes)高效地解决,先将所有数字...
立体八数码是在二维八数码的基础上扩展的,增加了更多的维度,使得问题的复杂性增加,解决起来更具挑战性。双向BFS是一种优化的搜索策略,它同时从初始状态和目标状态开始搜索,一旦两个搜索路径在中间某个节点相遇...
"Robot Motion"暗示我们需要处理与机器人运动路径规划相关的问题,可能涉及到几何计算、动态规划或者图论等概念。 【文件名称列表】 1. "POJ1573-Robot Motion.cpp":这是用C++语言编写的解决方案源代码文件,其中...