dp --- 二维dp + 最大上升子序列
滑雪
|
Time Limit: 1000MS |
Memory Limit: 65536K |
|
|
Total Submissions: 74477 |
Accepted: 27574 |
Description
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
Input
输入的第一行表示区域的行数R和列数C(1 <=
R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
Output
输出最长区域的长度。
Sample Input
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Sample Output
25
开始遇到这道题的时候感觉无从下手,什么二维矩阵dp想了好半天,最后也是百度了下才做出来的,主要书不知道怎么和最长上升子序列联系在一起,当明白了思路后才发现原来就是一道水题,但是也给这类型的题目提供了一种思路,所以还是值得总结一下。
【题目分析】
他给我们的是一个矩阵,矩阵里面的数值相当于高中地理里面学的海拔,让你找一条最长的下降线路出来,每次只可以往上下左右四个方向走。
收哦先这题是建立在dp里面的最长下降子序列的基础上的,现在的问题是怎么处理二维这样的情况。
如果二维矩阵中的某个坐标是(x,y),那么它上下两个坐标就是(x±1,y),左右两个坐标就是(x,y±1),我们在遍历的时候可以通过这个条件来判断是否是该点的上下左右四个坐标。
既然可以知道是否是相邻坐标了,那么怎么走就只是遍历的问题了。
首先按照高度递增排一下序,然后就是求最长上升子序列了。
//Memory Time
// 392K 360MS
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<climits>
#include<cmath>
#define MAX 110
#define LL long long
using namespace std;
struct Node{
int x,y,h;
};
Node a[MAX*MAX];
int dp[MAX*MAX];
int n,m;
bool cmp(Node a,Node b)
{
return a.h<b.h;
}
int main()
{
// freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
while(cin>>n>>m){
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[cnt].h,a[cnt].x=i,a[cnt].y=j,cnt++;
memset(dp,0,sizeof(dp));
dp[0]=1;
sort(a,a+cnt,cmp);
int ans=1;
for(int i=1;i<cnt;i++){
int tmp=0;
for(int j=0;j<i;j++){
if(abs(a[i].x-a[j].x)==1&&abs(a[i].y-a[j].y)==0&&a[j].h<a[i].h&&dp[j]>tmp)
tmp=dp[j];
if(abs(a[i].x-a[j].x)==0&&abs(a[i].y-a[j].y)==1&&a[j].h<a[i].h&&dp[j]>tmp)
tmp=dp[j];
}
dp[i]=tmp+1;
if(dp[i]>ans)
ans=dp[i];
}
cout<<ans<<endl;
}
return 0;
}
dp --- 二维dp + 最大上升子序列的更多相关文章
- 关于二维DP————站上巨人的肩膀
意匠惨淡经营中ing, 语不惊人死不休........ 前几天学了DP,做了个简单的整理,记录了关于DP的一些概念之类的,今天记录一下刚学的一个类型 ----关于二维DP 那建立二维数组主要是干嘛用的 ...
- 洛谷p1732 活蹦乱跳的香穗子 二维DP
今天不BB了,直接帖原题吧 地址>>https://www.luogu.org/problem/show?pid=1732<< 题目描述 香穗子在田野上调蘑菇!她跳啊跳,发现 ...
- HDU - 2159 FATE(二维dp之01背包问题)
题目: 思路: 二维dp,完全背包,状态转移方程dp[i][z] = max(dp[i][z], dp[i-1][z-a[j]]+b[j]),dp[i][z]表示在杀i个怪,消耗z个容忍度的情况下 ...
- 传纸条 NOIP2008 洛谷1006 二维dp
二维dp 扯淡 一道比较基本的入门难度的二维dp,类似于那道方格取数,不过走过一次的点下次不能再走(看提交记录里面好像走过一次的加一次a[i][j]的也AC了,,),我记得当年那道方格取数死活听不懂, ...
- 洛谷P1048 采药 二维dp化一维
题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个 ...
- SGU 199 Beautiful People 二维最长递增子序列
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20885 题意: 求二维最长严格递增子序列. 题解: O(n^2) ...
- To the Max 二维dp(一维的变形)
Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...
- hdu6078 Wavel Sequence dp+二维树状数组
//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...
- 经典DP 二维换一维
HDU 1024 Max Sum Plus Plus // dp[i][j] = max(dp[i][j-1], dp[i-1][t]) + num[j] // pre[j-1] 存放dp[i-1] ...
随机推荐
- python3.7 win10配置opencv和扩展库
- [Schematics] 2. EJS
Schematices using EJS as template language. template: <%# This will not appear in the generated o ...
- Good Article Good sentence HDU - 4416 (后缀数组)
Good Article Good sentence \[ Time Limit: 3000 ms\quad Memory Limit: 32768 kB \] 题意 给出一个 \(S\) 串,在给出 ...
- docz 强大简单的文档管理工具
使用docz我们可以用来方便的编写以及发布文档,同时提供漂亮友好的交互,可以快速的制作一个产品级的 站点,使用了了mdx 文件(还是markdown),同时可以方便的集成到自己的web 项目中 安装试 ...
- 如何在你的springboot(cloud)项目中引入我的github上的jar仓库呢?
1. 将此标签内容放到pom.xml仅次于project标签下 <repositories> <repository> <id>github</id> ...
- 单片机模块化程序: 单片机加入JSON是个不错的选择
这节需要知道的知识点 https://www.cnblogs.com/yangfengwu/p/11685325.html 下载JSON文件: 链接: https://sourcefo ...
- 【louguP1502】窗口的星星
题目链接 用两条扫描线从左往右扫描,距离为W,右边的扫描线扫到就加上,左边的扫到就减去, 线段树上的一点\(x\)维护\((x,x+H)\)的星星总价值,修改时直接修改\((x-H,x)\)就行了 坐 ...
- SpringBoot2.0给所有Controller添加统一前缀
需求 给所有Controller添加统一前缀 实现 在配置文件中添加:server.servlet.context-path: /api(不同SpringBoot版本会有区别,这里是采用2.0) 结果 ...
- 【cf比赛记录】Codeforces Round #601 (Div. 2)
Codeforces Round #601 (Div. 2) ---- 比赛传送门 周二晚因为身体不适鸽了,补题补题 A // http://codeforces.com/contest/1255/p ...
- HDU 6212 Zuma
Zuma 这个题没有素质!它卡常! 我发现网上很多人的题解都写得很奇怪,也不好确定正确性,所以我借这篇题解表达一下愚见 定义$ dp[i][j][0...4]$表示 0:消完了 1:还剩1个0 2:还 ...