这道题目,拿到手中,首先想到的是搜索,但是,后来想了想搜索不知道从哪搜起,就看了一下分类,一看属于动态规划类的,因为以前没有接触过动态规划,所以在网上搜了一下动态规划的思想,看过之后也有想到将它们到周围其他的点的距离再保存到一个新的数组中, 但是,这样子写了一下,感觉不行,就在网上搜了一下,确实,方法比这个好多了, 只需要保存一个就行,也就是,之保存当前点能滑的最长距离,最后直接遍历数组,找到这个最大的距离就行了。这样一来,问题就简单多了,最后利用搜索跟动规结合,还是挺容易理解的。

/*************************************************************************
> File Name: 3.cpp
> Author: Howe_Young
> Mail: 1013410795@qq.com
> Created Time: 2015年08月16日 星期日 11时09分27秒
************************************************************************/ #include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int maxn = ;
int mat[maxn][maxn];
int d[maxn][maxn];
int n, m;
const int nx[] = {, -, , }, ny[] = {, , , -};
int dp(int i, int j)
{
if (d[i][j] != )
return d[i][j];
d[i][j] = ;
for (int k = ; k < ; k++)
{
int x = nx[k] + i;
int y = ny[k] + j;
if (x >= && x <= n && y >= && y <= m && mat[i][j] > mat[x][y])
d[i][j] = max(d[i][j], dp(x, y) + );
}
return d[i][j];
}
int main()
{
int T;
cin >> T;
while (T--)
{
char name[];
scanf("%s %d %d", name, &n, &m);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
scanf("%d", &mat[i][j]);
memset(d, , sizeof(d));
int ans = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
ans = max(ans, dp(i, j));
printf("%s: %d\n", name, ans);
//cout << name << ": " << ans << endl;
}
return ;
}

下面的这个是最优代码,但是我看到有些地方可以改进,这样可以使程序更快,我就稍微改进了一点点,主要就是增加了临时变量来保存那个递归调用的结果,还有就是初始化的时候,用的memset, 这样如果数据量大的话会很快。

 #include <stdio.h>
#include <string.h> int r, c;
int Map[][], MaxLen[][];//Map用来存放地图,MaxLen用来存放当前点的能滑最大距离
int dir[][] = {{-, }, {, }, {, }, {, -}};
int search_MaxLen(int x, int y)
{
int len = ;
if(x < || y < || x > r || y > c)//判断越界
return ;
if(MaxLen[x][y] != )//如果已经找到,返回
return MaxLen[x][y];
for(int i = ; i < ; i++)
{
if(Map[x][y] > Map[x + dir[i][]][y + dir[i][]])
{
len = search_MaxLen(x + dir[i][], y + dir[i][]);
if(len > MaxLen[x][y])
MaxLen[x][y] = len;
}
}
return ++MaxLen[x][y];
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int len = , max_len = ;
memset(MaxLen, , sizeof(MaxLen));
scanf("%d %d", &r, &c);
for(int i = ; i <= r; i++)
for(int j = ; j <= c; j++)
scanf("%d", &Map[i][j]);
for(int i = ; i <= r; i++)
{
for(int j = ; j <= c; j++)
{
len = search_MaxLen(i, j);
if(len > max_len)
max_len = len;
}
}
printf("%d\n", max_len);
}
return ;
}

NYOJ 10 skiing动态规划心得的更多相关文章

  1. nyoj 10 skiing 搜索+动归

    整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int ...

  2. NYOJ 10 skiing(好题)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  3. NYOJ 10 skiing (深搜和动归)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且 ...

  4. nyoj 10 skiing(记忆化搜索)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  5. nyoj 10——skiing————————【记忆化搜索】

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  6. nyoj 10 skiing (DFS)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  7. nyoj 题目10 skiing —— 南阳oj

    题目信息例如以下: skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区 ...

  8. nyoj 708 ones 动态规划

    http://acm.nyist.net/JudgeOnline/problem.php?pid=708 状态转移方程的思路:对于一个数N,可以是N - 1的状态+1 得到,另外,也可以是(n / 2 ...

  9. nyoj 289 苹果 动态规划 (java)

    分析:0-1背包问题 第一次写了一大串, 时间:576  内存:4152 看了牛的代码后,恍然大悟:看来我现在还正处于鸟的阶段! 第一次代码: #include<stdio.h> #inc ...

随机推荐

  1. App Store自动下载WiFi与蜂窝数据切换机制

    写下这个给自己备忘,上次也有一次载了个跟头. 在iOS 7和8里面,除了设置--App Store里面自动更新,自动下载,以及使用蜂窝数据要关之外,别以为用了WiFi挂着程序,就万无一失了. 这种情况 ...

  2. Extjs中numberfield小数位数设置

    在默认的情况下,使用numberfield控件时只会显示两位小数,有的时候需要根据业务来确定显示小数的位数.通过设置下面的属性可以达到我们想要的目的: text : '存煤量(万吨)', dataIn ...

  3. 常用排序算法总结(C#版)

    首先,说说几个排序中的概念. 1.稳定排序和非稳定排序  简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的.反之,就是非稳定的. 比如:一组数 ...

  4. javascript 键值对

    <script type="text/javascript"> var arr = new Array(); arr['cn'] = '中国'; arr['usa'] ...

  5. [javascript]事件冒泡处理

    <!DOCTYPE html> <html> <head> <style type="text/css"> #box1 { widt ...

  6. JS 日常

    判断一个字符串是否在另一个字符串里面 var str = 'bblText'; if(str.indexOf("Text") > 0)  alert("包含了Tex ...

  7. 2014 青年歌手大赛 AC

    青年歌手大奖赛_评委会打分 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  8. angular2 学习笔记 ( Http 请求)

    refer : https://angular.cn/docs/ts/latest/guide/server-communication.html https://xgrommx.github.io/ ...

  9. mysql常用的命令大全

    常用的MySQL命令大全一.连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码1.例1:连接到本机上的MYSQL.首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令 ...

  10. Android 正则表达式验证手机和邮箱格式是否正确

    demo例子: package it.com.cc; import java.util.regex.Matcher; import java.util.regex.Pattern; import an ...