【POJ1088】【动态规划】滑雪问题 思路解析和代码

滑雪问题

题目链接
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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值