POJ1088 动态规划
题意:
解答:
这个题目和最长子序列什么的极为类似。只是之前都是一维,如今变成二维的了。仅此而已。因此我们能够想办法把它先变成一维的。
- 先用一个结构体存储这个矩阵,这就成一维的了。
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 动态规划的更多相关文章
- POJ1088滑雪(记忆化搜索+DFS||经典的动态规划)
		Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 84297 Accepted: 31558 Description M ... 
- 滑雪---poj1088(动态规划+记忆化搜索)
		题目链接:http://poj.org/problem?id=1088 有两种方法 一是按数值大小进行排序,然后按从小到大进行dp即可: #include <iostream> #incl ... 
- POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~
		滑雪 Time Limit: 1000MS Memory Limit: 65536k ... 
- DP----入门的一些题目(POJ1088 POJ1163 POJ1050)
		动态规划入门 DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050 (一) POJ1088,动态规划的入门级题目.嘿嘿,连题目描述都是难得一见的中文. 题目分析: 求最长 ... 
- 增强学习(三)----- MDP的动态规划解法
		上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ... 
- 简单动态规划-LeetCode198
		题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ... 
- 动态规划  Dynamic Programming
		March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ... 
- 动态规划之最长公共子序列(LCS)
		转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ... 
- C#动态规划查找两个字符串最大子串
		//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ... 
随机推荐
- C#实现DES加密解密,AES加密解密
			DES算法描述简介: DES是Data Encryption Standard(数据加密标准)的缩写.它是由IBM公司研制的一种加密算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密 ... 
- windows上的命令telnet
			telnet可以测试端口号是否可用,比如: telnet ip:port 或者 telnet www.baidu.com PS:win7环境下,默认没有安装telnet客户端,你可以去“控制面板”-- ... 
- Jquery获取服务器端控件的三种方式
			一 Jquery获得服务器控件值的方法由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<as ... 
- ubantu对pycharm创建快捷方式
			如果你刚开始没有建立快捷方式自己建立一个快捷方式,方法如下 终端输入:sudo gedit /usr/share/applications/Pycharm.desktop粘贴模板: [Desktop ... 
- Codeforces #428 Div2 D
			#428 Div2 D 题意 给出一些数,现在要求找出一些数满足 \(i_1 < i_2 < i_3 < ... < i_k\) 以及 \(gcd(a_{i_1}, a_{i_ ... 
- DP(悬线法)【P1169】 [ZJOI2007]棋盘制作
			顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内 ... 
- 使用lookup-method解决singleton bean依赖prototype bean的问题
			在Spring里面,当一个singleton bean依赖一个prototype bean,那么,因为singleton bean是单例的,因此prototype bean在singleton bea ... 
- 【DFS序】【莫队算法】【权值分块】bzoj2809 [Apio2012]dispatching
			题意:在树中找到一个点i,并且找到这个点子树中的一些点组成一个集合,使得集合中的所有点的c之和不超过M,且Li*集合中元素个数和最大 首先,我们将树处理出dfs序,将子树询问转化成区间询问. 然后我们 ... 
- [CF773D]Perishable Roads
			[CF773D]Perishable Roads 题目大意: 一个\(n(n\le2000)\)个点的完全图\(G\),定义\(d(x)\)为生成树上点\(x\)到根路径上的最小边权.问图\(G\)的 ... 
- [CodeChef-DGTCNT]Chef and Digits
			题目大意: 若一个十进制数$x$(不含前导零)满足数码$i$恰好出现$t_i$次,则这个数是坏的,否则是好的.求区间$[L,R](1\le L,R\le10^{18})$中有多少好数. 思路: 显然可 ... 
