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问题的更多相关文章

  1. 南阳理工ACM Skiing问题

    描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底 ...

  2. SCNU ACM 2016新生赛决赛 解题报告

    新生初赛题目.解题思路.参考代码一览 A. 拒绝虐狗 Problem Description CZJ 去排队打饭的时候看到前面有几对情侣秀恩爱,作为单身狗的 CZJ 表示很难受. 现在给出一个字符串代 ...

  3. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

  4. acm结束了

    最后一场比赛打完了.之前为了记录一些题目,开了这个博客,现在结束了acm,这个博客之后也不再更新了. 大家继续加油!

  5. 关于ACM的总结

    看了不少大神的退役帖,今天终于要本弱装一波逼祭奠一下我关于ACM的回忆. 从大二上开始接触到大三下结束,接近两年的时间,对于大神们来说两年的确算不上时间,然而对于本弱来说就是大学的一半时光.大一的懵懂 ...

  6. 第一届山东省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 ...

  7. 第一届山东省ACM——Balloons(java)

    Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...

  8. ACM之鸡血篇

    一匹黑马的诞生 故事还要从南京现场赛讲起,话说这次现场赛,各路ACM英雄豪杰齐聚南京,为争取亚洲总舵南京分舵舵主之职位,都使出了看 家本领,其中有最有实力的有京城两大帮清华帮,北大帮,南郡三大派上交派 ...

  9. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

随机推荐

  1. 导出DBF,并且提供下载 .

    原文:导出DBF,并且提供下载 . 导出DBF,并且提供下载 #region Declare string mFilePath = MapPath("../DataTmp/");  ...

  2. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  3. JSP+Java+properties+FileInputStream文件读写,JSP页面读取properties文件

    String realPath = request.getRealPath("WEB-INF/classes/com/properties/devicetype.properties&quo ...

  4. 页面中引入js的几种方法

    通常大家最为熟悉的是一下两种方法: 在页面中直接写入<script type="text/javascript">js代码</script>. 在页面中引入 ...

  5. 使用Windows2003创建DNS服务器 - 进阶者系列 - 学习者系列文章

    Windows 2003的DNS服务器的配置还是比较简单的.下面简要介绍下DNS服务器的配置. 1.    打开控制面板,选择 添加删除Windows组件,选择 网络服务 ,选择 详细信息,选择 域名 ...

  6. 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 ...

  7. ofbiz学习笔记01--多表关联查询

    不管做什么项目,肯定会用到多表关联查询数据,从网络查询得知ofbiz有三种多表关联查询方法 实现一:Screem.xml 中的 section 里,加 <action>, 加 get-re ...

  8. Tomcat 学习笔记二

    学习一 java.bean.PropertyChangeListener用来监听bean类的属性值改变.当改变时同时执行对应事件.而且是线程安全的.tomcat用此reload的Boolean值改变是 ...

  9. printf code

    printf背后的故事 2014-01-14 21:54 by Florian, 41 阅读, 0 评论, 收藏, 编辑 printf背后的故事 说起编程语言,C语言大家再熟悉不过.说起最简单的代码, ...

  10. iOS基础 - Quartz 2D绘图的基本步骤

    一.使用Quartz 2D绘图的基本步骤 1) 获取上下文context(绘制图形的地方) 2) 设置路径(路径是用来描述形状的) 3)  将路径添加到上下文 4)  设置上下文属性(设置颜色,线宽, ...