首页 > 其他分享 >洛谷 P1434 [SHOI2002] 滑雪

洛谷 P1434 [SHOI2002] 滑雪

时间:2023-01-23 22:15:39浏览次数:60  
标签:ch 洛谷 int ll P1434 const SHOI2002 DP define

P1434 [SHOI2002] 滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题数据很水,可以用记忆化过,这里说一下堆优化+DP的方法

 

首先是常用的DP逆向思维,也是此题最终的思路:倒着来

题目说是从从高到低:对于(i,j) 到它的四个方向的块,应该是DP[i][j]到了DP[ i+dx[] ] [ j+dy[] ],但显然这不好,我们从一个状态转为四个状态,这很不方便

 

 

但是我们如果逆向思维,从低到高走,题意是等价的,这是就从DP[ i+dx[] ] [ j+dy[] ]到 DP[i][j],四个状态转为一个状态,就舒服多了

 

 我们令DP[i][j]为走到这个(i,j)的最多步骤

显然DP[i][j]初始值为 1 ,这步没了就WA50分

因为这个是有方向的,我们就不能傻傻的for枚举DP,这也一定不是最优值

从贪心的角度考虑,既然是从低到高走,那么每次我们从当前的最低(i,j)开始,来算出DP[i][j]的值,DP[i][j]就是从它的四个方向转移过来,这时就体现了倒这来的好处

如何每次稳定的拿到最低呢?这是就用堆来维护就可以了。自定义堆,存入下标,高度,让高度进行排序,使得堆顶是最小的高度。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   //vector函数
#define popb pop_back  //vector函数
#define fi first
#define se second
const int N=200;
//const int M=;
//const int inf=0x3f3f3f3f;     //一般为int赋最大值,不用于memset中
//const ll INF=0x3ffffffffffff; //一般为ll赋最大值,不用于memset中
int T,n,m,h[N][N],dp[N][N];
int dx[5]={0,0,1,-1};
int dy[5]={1,-1,0,0};
struct node
{
    int x,y,h;
    friend bool operator <(const node &a,const node &b) { return a.h>b.h; } 
};
priority_queue<node> q;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dp[i][j]=1; //这个很重要,没这个就WA了 
            h[i][j]=read();
            q.push(node{i,j,h[i][j]});
        }
    }
    int ans=0;
    while(!q.empty())
    {
        node x=q.top();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int tx=dx[i]+x.x,ty=dy[i]+x.y;
            if(h[tx][ty]<h[x.x][x.y]) dp[x.x][x.y]=max(dp[x.x][x.y],dp[tx][ty]+1);
        }
        ans=max(ans,dp[x.x][x.y]);
    }
    printf("%d\n",ans);
    return 0;
}

 

标签:ch,洛谷,int,ll,P1434,const,SHOI2002,DP,define
From: https://www.cnblogs.com/Willette/p/17065593.html

相关文章

  • 洛谷P2036 PERKET题解
     先来审题,主要有以下几个条件:酸度求乘积,苦度求和,两者相减的值最小(当然是绝对值)。下面附上AC代码:#include<bits/stdc++.h>//万能头文件usingnamespacestd;//......
  • 洛谷 P1123 取数游戏 (又是写了好久 最后还是无奈看了题解……)
    对于这个题感觉是一个比较典型的dfs.本题的状态是对于每个数字你可以选也可以不选,但是一旦你选定某个数字之后,他会对其周围的数字产生影响所以一定要标记好(注意这里标记的......
  • 洛谷 P1002 [NOIP2002 普及组] 过河卒
    P1002[NOIP2002普及组]过河卒#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){intHorse_y[8]={2,1,-1,-2,-2,-1,1,2};......
  • 洛谷P4983 忘情 题解报告
    题目地址题意:把正整数序列分隔为m个区间,若单个区间的元素之和为X,则其贡献为\((X+1)^2\)。求所有区间的贡献之和的最小值。分析:wqs二分+斜率优化dp。用单调队列发可......
  • 约瑟夫问题(洛谷P1996)
    问题描述:有n个人,编号为1~n,按顺序围成一圈,从第一个人开始报数,到第m个人出列,再由下一个人重新从1开始报数,数到m再出列,直到所有人都出列,依次输出所有出列的人的编号。输入:两......
  • 我的洛谷成就
    我的成就AC之神成就一战成名成就红题收割者橙题收割者黄题收割者绿蓝收割者紫黑收割者强人之友领奖之王贡献标兵全勤标兵......
  • 洛谷普及组模拟赛 题解报告
    洛谷普及组模拟赛题解报告\[\bf{Prepared\by\InoueTakina.}\]前言:祝大家身体健康。本场比赛较为良心,经过了多次难度平衡,应该严格低于NOIP2018提高组,相信大家......
  • 洛谷 P2241 统计方形
    原题链接题解记住遍历时求i*j乘积的和就是该区域内矩形的个数遍历时求i,j最小值的和就是该区域内正方形的个数所以所有矩形的个数减去正方形的个数就是长方形个数#i......
  • 洛谷 P3392 涂国旗
    原题链接题解首先用一个二维数组记录每行中WBR的数量,用来提高查找速度其次就是用两层for循环进行区域划分,如下图所示然后对区域内的所需更改颜色进行统计,这里要注意......
  • 洛谷P3195 玩具装箱 题解报告
    题目地址题意:如题所述。分析:斜率优化dp模板题。题目没看清就下手,自以为题面所述中i>j;原始dp式子也没设计准确。中途在错误方向上头铁时,甚至没注意到横坐标是沿......