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. linux c ping 实现

    用c语言实现的linux中的ping命令 #include <stdio.h> #include <signal.h> #include <arpa/inet.h> ...

  2. asp.net webform生命周期

  3. Java利用jcifs集成AD域用户认证

    近期一段时间发现AD这东西老火了,尤其是涉及到安全这一方面的,所以AD域用户认证成了如今网络安全方面的产品必备!这里就简单的分享一下,Java通过jcifs集成AD域用户实现认证,以实现网络安全! 我 ...

  4. (12) MVC5 EF6 Bootstrap3

    MVC5 + EF6 + Bootstrap3 (12) 新建数据 系列教程:MVC5 + EF6 + Bootstrap3 上一节:MVC5 + EF6 + Bootstrap3 (11) 排序.搜 ...

  5. Spring之SpringMVC前端控制器DispatcherServlet(源码)分析

    1.DispatcherServlet作用说明 DispatcherServlet提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得 ...

  6. SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等)

    原文:[转]SQL SERVER 2005中如何获取日期(一个月的最后一日.上个月第一天.最后一天.一年的第一日等等) 在网上找到的一篇文章,相当不错哦O(∩_∩)O~ //C#本周第一天       ...

  7. Linux启用/关闭触摸板脚本

    一个可以启动关闭触摸板的shell脚本 运行一次关闭,再次运行开启. [shell] #!/bin/bash ts=`synclient -l|grep TouchpadOff` ts=${ts#*= ...

  8. C# 如何生成CHM帮助文件

    原文:C# 如何生成CHM帮助文件 前一段时间应公司要求,让我开发一个数据库字段信息CHM帮助文件生成软件.结果当时我就二了,这个东西我只用过,不知道咋做啊.没想到老大很随意说一句:"没事, ...

  9. uva 11181 - Probability|Given

    条件概率公式:P( A|B ) = P( AB ) / P( B ) 表示在事件B发生的前提,事件A发生的可能性: 问题的: 复位事件E:r个人买东西: 事件Ei:文章i个人买东西: 的要求是P( E ...

  10. ubuntu下的词典的安装

    因为从事开发,安装一个词典是很有必要,文中介绍安装openyoudao和stardic两个软件的方法 一.openyoudao的安装 因为是由window转来学ubuntu的,所以总是想安装和wind ...