ACM Skiing问题
ACM Skiing问题
描述
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更长。事实上,这是最长的一条。
- 输入
- 第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
后面是下一组数据; - 输出
- 输出最长区域的长度。(例如上题的最长长度应该是25)。
- 本题解题思路:
- 苦思不得其解,后来看了解题报告才知道思路,即求出每个点的最长路径,找出最长路径,单个点的路径是通过动态规划的思想求出。当前点的最长路径等于上下左右中某一点的最长路径加1.
- C#代码如下:
-
1 static int[,] F = new int[5, 5];//保存已求解的每一点的最长长度,最大限度的减少计算量
2 static void Main(string[] args)
3 {
4 int[,] M = new int[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} };
5 for (int i = 0; i < 5; i++)
6 {
7 for (int j = 0; j < 5; j++)
8 {
9 F[i, j] = 0;
10 Console.Write(M[i, j] + " ");
11 }
12 Console.WriteLine();
13 }
14 int max = -1;
15 for (int i = 0; i < 5; i++)
16 {
17 for (int j = 0; j < 5; j++)
18 {
19 int length = FindLongest(M, i, j, 5, 1000);
20 if (length > max)
21 max = length;
22 }
23 }
24 Console.WriteLine(max);
25 Console.Read();
26
27 }
28 /// <summary>
29 /// 求出最长路径的动态规划方式
30 /// </summary>
31 /// <param name="M">保存5*5矩阵</param>
32 /// <param name="m">开始求解点的横坐标</param>
33 /// <param name="n">开始求解点的纵坐标</param>
34 /// <param name="K">边界点,此处等于5</param>
35 /// <param name="value">上一点的值</param>
36 /// <returns>返回当前最长长度</returns>
37 public static int FindLongest(int[,] M, int m, int n, int K, int value)
38 {
39 //若超过边界或者当前点M[m,n]的值大于等于上一点的值value则返回。
40 if (m < 0 || n < 0 || m >= K || n >= K || M[m, n] >= value)
41 return 0;
42
43 if (F[m, n] > 0)
44 return F[m, n];
45 //找出四点中最长路径+1
46 F[m, n] = Math.Max(Math.Max(FindLongest(M, m + 1, n, K, M[m, n]), FindLongest(M, m, n + 1, K, M[m, n])), Math.Max(FindLongest(M, m - 1, n, K, M[m, n]), FindLongest(M, m , n-1, K, M[m, n])))+1;
47 return F[m,n];
48
49 }
1 static int[,] F = new int[5, 5];//保存已求解的每一点的最长长度,最大限度的减少计算量
2 static void Main(string[] args)
3 {
4 int[,] M = new int[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} };
5 for (int i = 0; i < 5; i++)
6 {
7 for (int j = 0; j < 5; j++)
8 {
9 F[i, j] = 0;
10 Console.Write(M[i, j] + " ");
11 }
12 Console.WriteLine();
13 }
14 int max = -1;
15 for (int i = 0; i < 5; i++)
16 {
17 for (int j = 0; j < 5; j++)
18 {
19 int length = FindLongest(M, i, j, 5, 1000);
20 if (length > max)
21 max = length;
22 }
23 }
24 Console.WriteLine(max);
25 Console.Read();
26
27 }
28 /// <summary>
29 /// 求出最长路径的动态规划方式
30 /// </summary>
31 /// <param name="M">保存5*5矩阵</param>
32 /// <param name="m">开始求解点的横坐标</param>
33 /// <param name="n">开始求解点的纵坐标</param>
34 /// <param name="K">边界点,此处等于5</param>
35 /// <param name="value">上一点的值</param>
36 /// <returns>返回当前最长长度</returns>
37 public static int FindLongest(int[,] M, int m, int n, int K, int value)
38 {
39 //若超过边界或者当前点M[m,n]的值大于等于上一点的值value则返回。
40 if (m < 0 || n < 0 || m >= K || n >= K || M[m, n] >= value)
41 return 0;
42
43 if (F[m, n] > 0)
44 return F[m, n];
45 //找出四点中最长路径+1
46 F[m, n] = Math.Max(Math.Max(FindLongest(M, m + 1, n, K, M[m, n]), FindLongest(M, m, n + 1, K, M[m, n])), Math.Max(FindLongest(M, m - 1, n, K, M[m, n]), FindLongest(M, m , n-1, K, M[m, n])))+1;
47 return F[m,n];
48
49 }
ACM Skiing问题的更多相关文章
- 南阳理工ACM Skiing问题
描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底 ...
- SCNU ACM 2016新生赛决赛 解题报告
新生初赛题目.解题思路.参考代码一览 A. 拒绝虐狗 Problem Description CZJ 去排队打饭的时候看到前面有几对情侣秀恩爱,作为单身狗的 CZJ 表示很难受. 现在给出一个字符串代 ...
- SCNU ACM 2016新生赛初赛 解题报告
新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...
- acm结束了
最后一场比赛打完了.之前为了记录一些题目,开了这个博客,现在结束了acm,这个博客之后也不再更新了. 大家继续加油!
- 关于ACM的总结
看了不少大神的退役帖,今天终于要本弱装一波逼祭奠一下我关于ACM的回忆. 从大二上开始接触到大三下结束,接近两年的时间,对于大神们来说两年的确算不上时间,然而对于本弱来说就是大学的一半时光.大一的懵懂 ...
- 第一届山东省ACM——Phone Number(java)
Description We know that if a phone number A is another phone number B’s prefix, B is not able to be ...
- 第一届山东省ACM——Balloons(java)
Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...
- ACM之鸡血篇
一匹黑马的诞生 故事还要从南京现场赛讲起,话说这次现场赛,各路ACM英雄豪杰齐聚南京,为争取亚洲总舵南京分舵舵主之职位,都使出了看 家本领,其中有最有实力的有京城两大帮清华帮,北大帮,南郡三大派上交派 ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
随机推荐
- 导出DBF,并且提供下载 .
原文:导出DBF,并且提供下载 . 导出DBF,并且提供下载 #region Declare string mFilePath = MapPath("../DataTmp/"); ...
- 一步一步写算法(之prim算法 中)
原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...
- JSP+Java+properties+FileInputStream文件读写,JSP页面读取properties文件
String realPath = request.getRealPath("WEB-INF/classes/com/properties/devicetype.properties&quo ...
- 页面中引入js的几种方法
通常大家最为熟悉的是一下两种方法: 在页面中直接写入<script type="text/javascript">js代码</script>. 在页面中引入 ...
- 使用Windows2003创建DNS服务器 - 进阶者系列 - 学习者系列文章
Windows 2003的DNS服务器的配置还是比较简单的.下面简要介绍下DNS服务器的配置. 1. 打开控制面板,选择 添加删除Windows组件,选择 网络服务 ,选择 详细信息,选择 域名 ...
- Oracle Database Instant Client 11g 32位和64位 安装包发布
Oracle Database Instant Client 11g 32位和64 Oracle Database Instant Client 11g 11.2.0.3.0 Instant Clie ...
- ofbiz学习笔记01--多表关联查询
不管做什么项目,肯定会用到多表关联查询数据,从网络查询得知ofbiz有三种多表关联查询方法 实现一:Screem.xml 中的 section 里,加 <action>, 加 get-re ...
- Tomcat 学习笔记二
学习一 java.bean.PropertyChangeListener用来监听bean类的属性值改变.当改变时同时执行对应事件.而且是线程安全的.tomcat用此reload的Boolean值改变是 ...
- printf code
printf背后的故事 2014-01-14 21:54 by Florian, 41 阅读, 0 评论, 收藏, 编辑 printf背后的故事 说起编程语言,C语言大家再熟悉不过.说起最简单的代码, ...
- iOS基础 - Quartz 2D绘图的基本步骤
一.使用Quartz 2D绘图的基本步骤 1) 获取上下文context(绘制图形的地方) 2) 设置路径(路径是用来描述形状的) 3) 将路径添加到上下文 4) 设置上下文属性(设置颜色,线宽, ...