博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1088 动态规划
阅读量:6236 次
发布时间:2019-06-22

本文共 1484 字,大约阅读时间需要 4 分钟。

题意:

这里写图片描写叙述

解答:

 这个题目和最长子序列什么的极为类似。只是之前都是一维,如今变成二维的了。仅此而已。因此我们能够想办法把它先变成一维的。

  • 先用一个结构体存储这个矩阵,这就成一维的了。
struct Node{   int height;  //这个是高度   int r;       //x坐标   int c;       //y坐标}a[100*100+5];然后我们能够依据height排序。从最高点開始考虑,,有点贪心的意思。。

和单源最短路径dijkstra类似。

  • 然后还是要存一个矩阵的~
int ma[100+2][100+2][2];//ma[][][0] :存储的是高度  ma[][][1] :这里将它作为DP递归,存储的是:到这个点时最长的长度
  • 然后我们依照那个结构体进行遍历。,每次遍历到一个节点i,我们考虑他的周围四个点,假设高度小于他们,更新(而且要取最大当中最大的DP值+1)。否则为1。(是不是和最长上升子序列一样???)
  • 结果就是当中的最大值

代码:

#include 
#include
#include
#include
#include
using namespace std;struct Node{ int height; int r; int c;}a[100*100+5];int dx[] = {
0,0,1,-1};int dy[] = {
1,-1,0,0};int ma[100+2][100+2][2];int R,C;bool cmp(const Node &a, const Node &b){ return a.height>b.height;}int main(){ //freopen("data.txt",'r'); scanf("%d%d",&R,&C); memset(a,0,sizeof(a)); memset(ma,0,sizeof(ma)); int k = 0; for(int i = 1; i<=R; i++){ for(int j = 1; j<=C; j++){ scanf("%d",&a[k].height); ma[i][j][0] = a[k].height; a[k].r = i; a[k++].c = j; } } sort(a,a+k,cmp); int ans = 1; for(int i = 0; i
R || y<1 || y>C) continue; if(ma[x][y][0] > a[i].height) maxx = max(maxx, ma[x][y][1]); } ma[a[i].r][a[i].c][1] = maxx+1; ans = max(ans,maxx+1); } printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/gavanwanggw/p/7270373.html

你可能感兴趣的文章
javascript之Style物
查看>>
C# 公历转农历
查看>>
LeetCode - Divide Two Integers
查看>>
去掉 “当前安全设置会使计算机有风险”提示
查看>>
sql 聚合函数
查看>>
ABP源码分析二十:ApplicationService
查看>>
学习OpenCV——BOW特征提取函数(特征点篇)
查看>>
帮你店铺日销千单的20个淘宝小技巧
查看>>
python deep copy and shallow copy
查看>>
I.MX6 Ethernet MAC (ENET) MAC Address hacking
查看>>
下载本 WebEnh博客 安卓APP
查看>>
iOS中常见 Crash 及解决方案
查看>>
【python】datetime获取日期,前一天日期
查看>>
Lua简易入门教程
查看>>
如果使用百度云盘同步电脑里文件夹
查看>>
linux内核栈与用户栈【转】
查看>>
一次完整的http事务
查看>>
spring事务传播机制
查看>>
freemaker
查看>>
一个leetcode解题报告类目,代码很简洁
查看>>