滑雪问题
题目链接
POJ不能解析#include<bits/stdc++.h>
个人思路
题意
input:
3 3
4 5 6
3 10 7
2 9 8
output:9
此题的最长的滑坡指的是滑坡的个数,每个格子代表一个滑坡,即从10开始出发,最长可以经过9个格子
错误思路1:一开始以为的是滑坡长度(数值)之和最大,此时输出为54
错误思路2:后来以为的是滑坡的出发点,此时输出为10
思路
整个思路可以类比最长下降子序列,与最长下降子序列相比,这个是二维的,且边界值并非dp[0][0]或dp[1][1],个人采取结构体存储各节点值和节点坐标,并对结构体升序排序,则排序后的第一个节点即为整个dp数组的边界;在求解过程中是根据排序的顺序进行求解的。
dp[i][j]表示坐标为(i,j)的最长滑坡为dp[i][j]
自顶向下分析:
- 求最优解:求最长的滑坡
- 最优子结构:当前位置的最长滑坡,依赖于前面已经求得的最长滑坡
- 重叠子问题:想要求中间第i步(坐标是i,j)的最大值dp[i][j],需要从边界开始计算,直到求到当前位置;想要求终点的最大值dp[m-1][n-1],仍要从边界位置开始计算
自下而上解决问题:
- 边界:经过排序后,值最小的即为边界
- 状态转移:
探索上下左右四个位置,若当前节点数值小,才符合题意,此时在当前节点dp[i][j]和周围节点dp[x][y]+1中取最大值,即dp[i][j] = max(dp[i][j], dp[x][y] + 1);
注意
- 数组在探索时不能越界访问
- ans的初始值为1,当矩阵中所有数值均相等时,答案为1
个人思路代码
/*
* @Author: LLX
* @Date: 2020-10-31 19:19:43
* @Last Modified by: SEUer
* @Last Modified time: 2020-10-31 19:20:05
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int dp[505][505];//dp[i][j]表示:坐标为i,j的最长滑坡长度为dp[i][j]
int matrix[500][500];
int dir[4][2] = {
{
0, 1}, {
0