题意:

id=1088">题目链接

解答:

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

  • 先用一个结构体存储这个矩阵,这就成一维的了。
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 <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring> 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*C; i++){
int maxx = 0;
for(int j =0; j<4; j++){
int x = a[i].r + dx[j];
int y = a[i].c + dy[j];
if(x<1 || x>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;
}

POJ1088 动态规划的更多相关文章

  1. POJ1088滑雪(记忆化搜索+DFS||经典的动态规划)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 84297   Accepted: 31558 Description M ...

  2. 滑雪---poj1088(动态规划+记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 有两种方法 一是按数值大小进行排序,然后按从小到大进行dp即可: #include <iostream> #incl ...

  3. POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~

    滑雪 Time Limit: 1000MS                    Memory Limit: 65536k                                        ...

  4. DP----入门的一些题目(POJ1088 POJ1163 POJ1050)

    动态规划入门 DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050 (一) POJ1088,动态规划的入门级题目.嘿嘿,连题目描述都是难得一见的中文. 题目分析: 求最长 ...

  5. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  6. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  7. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  8. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  9. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

随机推荐

  1. 【转】python 生成器和迭代器有这篇就够了

    总结得特别好,转自:https://www.cnblogs.com/wj-1314/p/8490822.html 本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个 ...

  2. 洛谷 P1308 统计单词数【string类及其函数应用/STL】

    题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...

  3. DFS之奇偶剪枝

    问题描述: 给定一个 N * M的迷宫+起点+终点 ,迷宫中有一些障碍无法穿过,问能否不重复也不停留地在刚好一共走 t 步出迷宫. 先上结论: 在理想情况下,s到e需要的最小步数为m=|ex-sx|+ ...

  4. POJ 2488 A Knight's Journey (回溯法 | DFS)

    题目链接:http://poj.org/problem?id=2488 题意: 在国际象棋的题盘上有一个骑士,骑士只能走“日”,即站在某一个位置,它可以往周围八个满足条件的格子上跳跃,现在给你一个p ...

  5. 训练指南 UVA - 11419(二分图最小覆盖数)

    layout: post title: 训练指南 UVA - 11419(二分图最小覆盖数) author: "luowentaoaa" catalog: true mathjax ...

  6. 二分+Kruskal【p2798】爆弹虐场

    Description 某年某月某日,Kiana 结识了一名爆弹虐场的少年. Kiana 仗着自己多学了几年OI,所以还可以勉勉强强给这位少年 讲一些自己擅长的题.具体来说,Kiana 先给这位少年灌 ...

  7. ASP.NET Core 2.2 基础知识(十五) Swagger

    安装 Nuget 包 注册 Swagger public void ConfigureServices(IServiceCollection services) { services.AddMvc() ...

  8. View Controller Basics学习记录

    1.UIView,UIScreen ,UIWindow的区别? UIScreen是关于设备的尺寸大小.UIWindow是在UIScreen上作画的区域.UIView是在uiwindow上draw视图. ...

  9. java中为什么要用多线程

    我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread).线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比 ...

  10. SSH框架的简单含义

    典型的J2EE三层结构,分为表现层.中间层(业务逻辑层)和数据服务层.三层体系将业务规则.数据访问及合法性校验等工作放在中间层处理.客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与 ...