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 ...
随机推荐
- [前端笔记]第一篇:html
什么是 HTML? HTML 是用来描述网页的一种语言.HTML 指的是超文本标记语言 (Hyper Text Markup Language)HTML 不是一种编程语言,而是一种标记语言 (mark ...
- C语言初学 数组 打印菱形
#include<stdio.h> #include<stdlib.h> int main() { int n,i,j; printf("---开始打印符号--\n& ...
- Unity扩展编辑器--类型3:Custom Editors
Custom Editors 加速游戏制作过程的关键是为哪些频繁使用的组件创建自定义的编辑器,为了举例,我们将会使用下面这个极其简单的脚本进行讲解,它的作用是始终保持一个对象注视某一点. public ...
- elasticsearch常用的插件
deb 安装/usr/share/elasticsearch/ https://github.com/hangxin1940/elasticsearch-cn-out-of-box 包可以参考 ...
- JS之路——常用正则表达式
整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数 ...
- JSP EL表达式的运用
EL表达式的基本使用 1访问bean属性 第一种方式${user.name} 容器一次从pageContext,request,session,application中查找(实际上是调用request ...
- C语言字符数组越界现象
今天在用C的过程中发现一个奇怪的现象.代码如下: ]; chs[] = 'a'; chs[] = 'b'; printf(]); 结果 输出 是 a. 在网上查了一下.有个网友是这样回答的: “ 我 ...
- java Future 模式
考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓 的現象,所以我們希望在文件開啟之後,仍有一個背景作業持 ...
- 【HDOJ】1277 全文检索
AC自动机,静态数组,动态分配TLE. /* 1277 */ #include <iostream> #include <cstdio> #include <cstrin ...
- OpenGl学习总结
http://wenku.baidu.com/view/5305fe4f866fb84ae45c8dcd.html