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. SQL代理执行EXE可执行程序

    原文:SQL代理执行EXE可执行程序  1.如果没有启用xp_cmdshell安全配置是不可以使用的-- 启用xp_cmdshellEXEC sp_configure 'xp_cmdshell', 1 ...

  2. Xutils呼叫流源代码文件下载方法

    //我主要是好奇Xutils哪里回调onLoading(),查找等了很久也没找到,果然easy查找只是把它写下来 前言: 1.代码摘要只有主线,提供一般流程 2.为了易于理解,码变量名,而是类名的驼峰 ...

  3. 顶级jQuery树插件

    顶级jQuery树插件 顶级jQuery树插件 2013-03-05 17:20 139人阅读 评论(0) 收藏 举报 jsTree JsTree是一个基于jQuery的Tree控件.支持HTML.J ...

  4. Windows 7硬盘安装CentOS 6.4 双系统 (WIN7硬盘安装Linux(Fedora 16,CentOS 6.2,Ubuntu 12.04))

     WIN7下硬盘安装Linux(Fedora 16,CentOS 6.2.Ubuntu 12.04) 近期在看<鸟哥私房菜:基础学习篇>.认为非常不错,想要用U盘装个windows 7 和 ...

  5. C#异步Socket示例

    C#异步Socket示例 概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域, ...

  6. SQL Server 性能调优 之运行计划(Execution Plan)调优

    运行计划中的三种 Join 策略 SQL Server 存在三种 Join 策略:Hash Join,Merge Join,Nested Loop Join. Hash Join:用来处理没有排过序/ ...

  7. windows2008 配置安装FTP服务器

    windows2008 配置安装FTP服务器 今天在服务器上开了IIS7,但是要求把一个附件文件夹拷贝到根目录下面,这个附件文件夹有2G多大小,直接用远程桌面映射,一直都拷贝不成功,而且本地缓存越来越 ...

  8. QTP脚本不能录制怎么办?

    QTP是基于VBS脚本语言的,大部分VBS脚本都能在QTP上运行,只是在一些细节上略有不同,比如说VBS上停止用sleep,QTP上用wait.QTP的强大之处在于对程序窗口的操作,有很多针对窗体的属 ...

  9. IOS UI 第二篇:基本UI

    1.UI书写:   一个小练习图片如下:     代码如下:     @implementation AppDelegate{    UIControl *control;    UILabel *l ...

  10. IOS UI 第一篇:基本UI

    1. UI 书写 最基本创建一个label 标签 写一个first rate :      UILabel *label = [[UILabel alloc] initWithFrame:CGRect ...