NYOJ 10 skiing动态规划心得
这道题目,拿到手中,首先想到的是搜索,但是,后来想了想搜索不知道从哪搜起,就看了一下分类,一看属于动态规划类的,因为以前没有接触过动态规划,所以在网上搜了一下动态规划的思想,看过之后也有想到将它们到周围其他的点的距离再保存到一个新的数组中, 但是,这样子写了一下,感觉不行,就在网上搜了一下,确实,方法比这个好多了, 只需要保存一个就行,也就是,之保存当前点能滑的最长距离,最后直接遍历数组,找到这个最大的距离就行了。这样一来,问题就简单多了,最后利用搜索跟动规结合,还是挺容易理解的。
/*************************************************************************
> 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动态规划心得的更多相关文章
- nyoj 10 skiing 搜索+动归
整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int ...
- NYOJ 10 skiing(好题)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- NYOJ 10 skiing (深搜和动归)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且 ...
- nyoj 10 skiing(记忆化搜索)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- nyoj 10——skiing————————【记忆化搜索】
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- nyoj 10 skiing (DFS)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- nyoj 题目10 skiing —— 南阳oj
题目信息例如以下: skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区 ...
- nyoj 708 ones 动态规划
http://acm.nyist.net/JudgeOnline/problem.php?pid=708 状态转移方程的思路:对于一个数N,可以是N - 1的状态+1 得到,另外,也可以是(n / 2 ...
- nyoj 289 苹果 动态规划 (java)
分析:0-1背包问题 第一次写了一大串, 时间:576 内存:4152 看了牛的代码后,恍然大悟:看来我现在还正处于鸟的阶段! 第一次代码: #include<stdio.h> #inc ...
随机推荐
- php中的双引号和单引号的区别?
1.单引号里面的字符串直接全部转义,原样输出(即:单引号内部的变量不会被执行) 2.双引号里面的变量会被替换(即:变量会执行) 例如:$name = 'hello';echo "the $n ...
- jquery 节点操作大全
$para.attr("title"); 实例: <script type="text/javascript"> //<![CDATA[ $( ...
- [Python笔记]第八篇:模块
本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...
- Swift中使用构建配置来支持条件编译-b
在Objective-C中,我们经常使用预处理指令来帮助我们根据不同的平台执行不同的代码,以让我们的代码支持不同的平台,如: 1 2 3 4 5 6 7 8 9 #if TARGET_OS_IPHON ...
- 初识Java反射机制
1.ClassLoader的类加载机制:并非一次性加载,而是需要的时候加载(运行期间动态加载)(Class文件加载到内存的代码段),static语句块在加载后执行一次.dynamic语句块(就是一个语 ...
- poj Fishnet
http://poj.org/problem?id=1408 #include<cstdio> #include<cstring> #include<cmath> ...
- poj Organize Your Train part II
http://poj.org/problem?id=3007 #include<cstdio> #include<algorithm> #include<cstring& ...
- Android自定义ActionBar
Android 3.0及以上已经有了ActionBar的API,可以通过引入support package在3.0以下的平台引用这些API,但这儿呢,完全自定义一个ActionBar,不用引入额外ja ...
- Apache-Tika解析PDF文档
通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理PDF格式的文章,如下: package com.mengyao.tika.app; im ...
- 3D视频可能出现的质量问题 (MSU出品)
俄罗斯的MSU Graphics & Media Lab (Video Group)提出的3D视频存在的几种问题.有一定的参考价值,在此翻译一下. 他们目前总结出4种问题: 水平视差(Hori ...