动态规划——滑雪

编程入门 行业动态 更新时间:2024-10-15 00:22:54

<a href=https://www.elefans.com/category/jswz/34/1771299.html style=动态规划——滑雪"/>

动态规划——滑雪

动态规划——滑雪

来源于洛谷P1434 [SHOI2002]滑雪

解题思路


本题考虑采用四个方向搜索的方式,但是值得注意的是

并不能直接从头到尾遍历数组,也不能从尾到头遍历数组,而是应该使用一个优先队列来使得先遍历值比较小的点,再遍历值比较大的点!

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#define rep(i,s,n) for(int i=s;i<n;i++)
#define reb(i,d,n) for(int i=n;i>=d;i--)
using namespace std;
const int SIZE = 101;
int res[SIZE][SIZE];
int nums[SIZE][SIZE];struct data {int x;int y;int val;
};
int m, n;
int max_res = 0;
struct cmp {bool  operator ()  (struct data d1, struct data d2) {return d1.val>d2.val;//升序}
};
priority_queue<struct data, vector<struct data>, cmp > _index;
void solve1()
{const int xx[][2] = { {-1,0},{1,0},{0,1},{0,-1} };while (1){if (_index.empty())break;struct data temp = _index.top();_index.pop();int i = temp.x;int j = temp.y;rep(k, 0, 4){if (i + xx[k][0] >= 0 && i + xx[k][0] <= m - 1 && j + xx[k][1] >= 0 && j + xx[k][1] <= n - 1){int temp = nums[i][j] - nums[i + xx[k][0]][j + xx[k][1]];if (temp > 0)res[i][j] = max(res[i][j], res[i + xx[k][0]][j + xx[k][1]] + 1);max_res = max(max_res, res[i][j]);}}}
}int main()
{scanf("%d %d", &m, &n);memset(res, 0, sizeof(res));rep(i, 0, m)rep(j, 0, n){scanf("%d", &nums[i][j]);_index.push({ i,j,nums[i][j] });}solve1();printf("%d", max_res+1);return 0;}

注意

洛谷的变量名似乎不能取为index,否则会编译报错

另外在cmp中,如果是>则代表升序

更多推荐

动态规划——滑雪

本文发布于:2023-07-28 20:00:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1295046.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:动态   滑雪

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!