HooLee
If you believe, you can!
C++博客
首页
新随笔
新文章
联系
管理
poj1088滑雪
题意:找出矩阵中的最长下降序列的长度。
解题思路:
1.回溯,时间复杂度,指数级别。这是一种很容易想到的做法,不过会超时。
2.动态规划,时间复杂度O(N^2)。相信我们都学过一维的
最长上升子序列
问题,这一题是一维的变形,我们只需稍加转换就可以转换为一维的。
先来回想一下一维的最长上升子序列的做法:对一个给定的节点p,我们只需枚举p前面的所有节点的最长上升子序列的长度,用p前面的节点的长度去试图更新p的长度即可。
我们如何将本题转化为一维的问题呢?我们只需将矩阵中的所有点按照他的high排序,然后按照一维的处理即可。只不过p前面的节点在更新p时还要考虑他们在矩阵中的相对位置,因为只有跟p相邻的四个点才有可能去更新p点的长度。
代码
1
import
java.io.
*
;
2
import
java.util.
*
;
3
class
Main
4
{
5
private
static
int
R, C;
6
private
static
MyNode[] nds
=
new
MyNode[
110
*
110
];
7
public
static
void
main(String[] args)
8
{
9
10
Scanner sc
=
new
Scanner(System.in);
11
R
=
sc.nextInt();
12
C
=
sc.nextInt();
13
int
count
=
0
;
14
for
(
int
i
=
0
; i
<
R; i
++
)
15
{
16
for
(
int
j
=
0
; j
<
C; j
++
)
17
{
18
int
h
=
sc.nextInt();
19
nds[count
++
]
=
new
MyNode(i, j, h);
20
}
21
}
22
Arrays.sort(nds,
0
, count);
23
//
/
24
//
for(int i = 0; i < count; i++)
25
//
System.out.println("::" + nds[i].getH());
26
//
27
int
lens[][]
=
new
int
[R][C];
28
for
(
int
i
=
0
; i
<
R; i
++
)
29
Arrays.fill(lens[i],
1
);
30
for
(
int
i
=
1
; i
<
count; i
++
)
31
{
32
for
(
int
j
=
0
; j
<
i; j
++
)
33
{
34
int
r2
=
nds[i].getR();
35
int
c2
=
nds[i].getC();
36
int
h2
=
nds[i].getH();
37
38
int
r1
=
nds[j].getR();
39
int
c1
=
nds[j].getC();
40
int
h1
=
nds[j].getH();
41
if
(Math.abs(r2
-
r1)
+
Math.abs(c1
-
c2)
==
1
&&
h2
>
h1
42
&&
lens[r2][c2]
<=
lens[r1][c1])
43
{
44
lens[r2][c2]
=
lens[r1][c1]
+
1
;
45
}
46
}
47
}
48
int
max
=
0
;
49
for
(
int
i
=
0
; i
<
R; i
++
)
50
{
51
for
(
int
j
=
0
; j
<
C; j
++
)
52
if
(lens[i][j]
>
max)
53
max
=
lens[i][j];
54
}
55
System.out.println(max);
56
}
57
58
}
59
class
MyNode
implements
Comparable
<
MyNode
>
60
{
61
private
int
r;
62
private
int
c;
63
private
int
h;
64
public
MyNode(
int
r,
int
c,
int
h)
65
{
66
this
.r
=
r;
67
this
.c
=
c;
68
this
.h
=
h;
69
}
70
public
int
getR()
71
{
72
return
r;
73
}
74
public
int
getC()
75
{
76
return
c;
77
}
78
public
int
getH()
79
{
80
return
h;
81
}
82
public
int
compareTo(MyNode n2)
83
{
84
return
h
-
n2.h;
85
}
86
}
posted on 2013-04-16 18:36
小鼠标
阅读(397)
评论(0)
编辑
收藏
引用
所属分类:
Java基础练习
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
编辑距离
闰年判断
正则表达式简单笔记
Excel格式地址转换
一道模拟题——机器人行走距离计算
排列练习2
素数筛法
排列组合练习
排列组合
poj1068Parencodings
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
<
2012年7月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我参与的随笔
随笔分类
(111)
C语言(3)
DP(9)
Java笔记(1)
Java基础练习(25)
安卓(1)
本科毕设(1)
博弈(1)
大数(7)
回溯(2)
排序(10)
暑期培训周赛(3)
数据结构(7)
数论(1)
水题(8)
图论(24)
网选训练(8)
随笔档案
(127)
2014年3月 (1)
2013年7月 (10)
2013年5月 (1)
2013年4月 (11)
2013年3月 (8)
2012年10月 (1)
2012年9月 (12)
2012年8月 (38)
2012年7月 (14)
2012年6月 (2)
2012年5月 (8)
2012年4月 (6)
2012年3月 (6)
2012年2月 (4)
2011年8月 (5)
friends
陈钢
大鹏
党姐
焦林枫
汪涛
小白学长
媛姐
媛姐csdn
最新评论
1. re: 线段树
是这个样子的,所以在OJ有时候“卡住”了也不要太灰心,没准真的不是自己的原因呢。
加油,祝你好运啦!
--小鼠标
2. re: 线段树
对于编程竞赛来说,Java所需时间一般为C/C++的两倍。合理的竞赛给Java的时间限制是给C/C++的两倍。
--伤心的笔
3. re: poj1273--网络流
过来看看你。
--achiberx
4. re: (转)ubuntu11.10无法启动无线网络的解决方法
膜拜大神。。查了一个下午资料终于在这里解决了问题。。神牛说的区域赛难道是ACM区域赛。。?
--Hang
5. re: 快速排序、线性时间选择
博主,谢谢你的文章。你的方法可以很好的处理分区基准在数组中重复的情况,书上的方法遇到这种输入会堆栈溢出。书上给出了解释但给的方法貌似不简洁。
--lsxqw2004
阅读排行榜
1. 单调队列(5480)
2. Linux select()函数使用(3954)
3. 快速排序、线性时间选择(3619)
4. poj3468--绝对经典的线段树题(3610)
5. 优先队列--堆实现(3291)