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. PL/SQL联系oracle成功可以sql解决的办法是检查表的名称无法显示

    有时,因为机器突然断电或其他原因PL/SQL它甚至不能在数据库表后显示.序列和其它元素.使用SQL Windows运行查询一般查询,登录或同样的现象再次. 我是不是可以解决因重复登录的猜测是,PLSQ ...

  2. 最流行的Node.js应用开发框架简介

    最流行的Node.js应用开发框架简介 快速开发而又容易扩展,高性能且鲁棒性强.Node.js的出现让所有网络应用开发者的这些梦想成为现实.但是,有如其他新的开发语言技术一样,从头开始使用Node.j ...

  3. VS2010类模板修改——添加版权、说明

    VS2010类模板修改——添加版权.说明 最近在学习使用Memcache,就想着用C#代码写一个实现Cache与Memcache以及将来若是能融入Redis切换使用的程序集...不过刚开始写代码,强迫 ...

  4. java设计模式之四建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

  5. C语言第12轮:指针

    C语言第12轮:指针 [学习目标] 1.        指针 2.        指针与数组 A: 指针的概念 内存存储单元按字节排序.每一个字节编有序号.我们称之为地址.因为能够通过地址就能够找到所 ...

  6. android意图传递参数返回结果(六)

    例如,有两页a,b. a参数传递到页面b页面,b后,将获得的参数的处理页,然后将结果传回与参数的页面a. 1.a主页MainActivity的代码类型,如以下: private Button butt ...

  7. MVC5 EF6 Bootstrap3 HtmlHelper

    MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下) 上一节:MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上) 源码下载 ...

  8. C# 文件下载类

    using System; using System.Net; using System.IO; using System.Text; using System.Web; using System.W ...

  9. shell awk统计重复个数

    awk是一个很强大的工具,一个常见的用法就是统计一个文件中重复的列值的个数,这也是面试时面试官经常问的一个问题. 举个例子: 有个文件file.log的内容如下: http://www.sohu.co ...

  10. 告别alert,拥抱console

    记得学习javascript的第一个demo就是alert("Hello  World");可是学习接触javascript这么长时间了还是在alert,因为javascript调 ...