【记忆化搜索+优化】10411 - SKAKAVAC

【记忆化搜索+优化】10411 - SKAKAVAC

Time Limit: 4000MS
Memory Limit: 36000KB

给定一个N-N的矩形,每个格子有一个数字,某人最初在R行C列的位置,他可以按以下规则移动:
1.跳到相邻的行,但列数差要大于1的所有格子。跳到相邻的列,位行数差要大于1的所有格子。即如果当前位置是(r1,c1)要跳到(r2,c2)则它们满足:
|r1-r2|=1且|c1-c2|>1或者|c1-c2|=1且|r1-r2|>1
2.目标格子的数字严格大于起跳格子的数字。
要求计算在这种规则下走过的最多的格子。
输入:
第一行1个整数N表示矩形的大小。(1 ≤ N ≤
1500)
第二行两个数字R (1 ≤ R ≤
N) 和 C (1 ≤ C ≤
N)初始位置。.
接下来N行,每行N个数,表示每个格子里的数字。
输出:
一个整数表示走过的最多的格子。
注:50%的数据N小于100,80%的数据N小于1000;
样例:
输入:
4
1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
输出:
4
输入:
5
3 3
20 16 25 17 12
11 13 13 30 17
15 29 10 26 11
27 19 14 24 22
23 21 28 18 13
输出:
21

Source
coi2008-2009-1

先上开始写的20行暴搜程序

 1 # include<cmath>
 2 # include<queue>
 3 # include<stdio.h>
 4 # include<cstring>
 5 # include<iostream>
 6 # include<algorithm>
 7 using namespace std;
 8 const int maxn=1500+50;
 9 int map[maxn][maxn];
10 int tot=0,n;
11 queue<int>q;
12 int dfs(int r1,int c1,int cur){
13     for(int r2=1;r2<=n;r2++)
14     for(int c2=1;c2<=n;c2++)
15     if(map[r2][c2]>map[r1][c1]&&(abs(r1-r2)==1&&abs(c1-c2)>1||abs(c1-c2)==1&&abs(r1-r2)>1))
16     dfs(r2,c2,cur+1);
17     tot=max(tot,cur);
18 }
19 int main(){
20     scanf("%d",&n);
21     int sr,sc;scanf("%d%d",&sr,&sc);
22     for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]);
23     dfs(sr,sc,1);
24     printf("%d",tot);
25     return 0;
26 }

然后给出50分的计划搜索

 1 # include<cmath>
 2 # include<stdio.h>
 3 # include<algorithm>
 4 using namespace std;
 5 const int maxn=1500+50;
 6 int map[maxn][maxn],dp[maxn][maxn];
 7 int tot=0,n;
 8 int dfs(int r1,int c1){
 9     int ok=1;
10     if(dp[r1][c1])return dp[r1][c1];
11     for(int r2=1;r2<=n;r2++)
12     for(int c2=1;c2<=n;c2++)
13     if(map[r2][c2]>map[r1][c1]&&(abs(r1-r2)==1&&abs(c1-c2)>1||abs(c1-c2)==1&&abs(r1-r2)>1)){
14         dp[r1][c1]=max(dp[r1][c1],dfs(r2,c2)+1);
15         ok=0;
16     }
17     if(ok)dp[r1][c1]=1;
18     return dp[r1][c1];
19 }
20 int main(){
21     scanf("%d",&n);
22     int sr,sc;scanf("%d%d",&sr,&sc);
23     for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]);
24     dfs(sr,sc);
25     printf("%d",dp[sr][sc]);
26     return 0;
27 }
时间: 2024-11-07 01:25:36

【记忆化搜索+优化】10411 - SKAKAVAC的相关文章

路径方案数_mod_SPFA_记忆化搜索_C++

本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易码一些,而且跑得快一些) 话说不取模也可以A,数据太水 很水的题吧,先 SPFA 跑一遍 2 的最短路,然后记忆化搜索统计方案 不难证明在加上最短路的限制条件后,图变成了一个 DAG 证明:首先有向是显然的,不可能存在两点 x,y,它们的最短路 d[x]>d[y] 又 d[x]<d[y] 若存在一

集训第五周动态规划 I题 记忆化搜索

Description 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 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子

sicily 1219(记忆化搜索)

题目链接:sicily 1214 解题思路: 博弈题,用搜索来做.但是,如果用普通的搜索来做的话,是会超时的--复杂度大约是O( n^n ),所以需要采用记忆化搜索的方法(其实差不多就是动态规划了,但是这里是树形DP). 状态: 用集合S表示现在树的状态,i 表示现在轮到谁进行砍边,dp[ S ][ i ]表示最优值.集合S可以用二进制来表示,即001表示现在还剩下第0条边. 状态转移: 1)A的目标是取最大值,B的目标是取最小值,我们在推导当前状态的最优解时,需要分两种情况考虑!即A得维护较大

hdu1428 记忆化搜索(BFS预处理最短路径和+DP+DFS)

题意:有一块 n * n 大小的方形区域,要从左上角 (1,1)走到右下角(n,n),每个格子都有通过所需的时间,并且每次所走的下一格到终点的最短时间必须比当前格子走到重点的最短时间短,问一共有多少种走法. 这道题还是很明显的 DP 的,而且鉴于走到相邻格点可以上下左右走,所以我很快就锁定了记忆化搜索这种 DP 方式,但是事实上我的思路大方向的确没有错误,但是我仍然没有很好地挖掘题目的信息.我的想法是,某点到结尾的最短距离我可以转化成到起始点的最短距离,这样我就能从开头的点开始遍历,并且在遍历的

hdu 1978(记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2945    Accepted Submission(s): 1727 Problem Description 这是一个简单的生存游戏,你控制一个机器人从一

【BZOJ3769】spoj 8549 BST again DP(记忆化搜索?)

[BZOJ3769]spoj 8549 BST again Description 求有多少棵大小为n的深度为h的二叉树.(树根深度为0:左右子树有别:答案对1000000007取模) Input 第一行一个整数T,表示数据组数. 以下T行,每行2个整数n和h. Output 共T行,每行一个整数表示答案(对1000000007取模) Sample Input 2 2 1 3 2 Sample Output 2 4 HINT 对于100%的数据,1<=n<=600,0<=h<=60

【算法学习笔记】55.DFS 记忆化搜索 SJTU OJ 1063 小M爱滑雪

Description 小M超级喜欢滑雪~~ 滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当小M滑到坡底,便不得不再次走上坡或者等待升降机来载你.小M想知道滑雪场中最长底的滑坡.滑雪场由一个二维数组给出.数组的每个数字代表点距离水平面的相对距离.下面是一个例子 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 小M可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子中,一条可滑行的

UVa 10118 Free Candies (记忆化搜索+哈希)

题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走多少对糖果. 析:首先看到的是时间30s,这么长时间,一想应该是暴力了吧,后来一想应该是记忆化搜索,既然这么长时间,应该得优化一下,不然可能超时, 但是数据好像挺水,才运行了60ms,并不知道是怎么回事,接下来说说这个题,用 d[a,b,c,d] 来表示 分别从 第一,二,三,四堆拿的最多糖果, 如

动态规划&mdash;&mdash;数字三角形(递归or递推or记忆化搜索)

动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个状态定义下,原问题的解就是d(i,j). 下面看一下不同状态之间如何转移.从格子(i,j)出发有两种策略.如果向左走,则到(i+1,j)后需要求"从(i+1,j)出发能得到的最大和"这一问题,即d(i+1,j). 类似的,往右走之后需要求解d(i+1,j+1).由于可以在这两个决策中自由选