码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-25 21:24:50      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   for   strong   sp   

【记忆化搜索+优化】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 }

 

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

标签:style   blog   http   color   io   os   for   strong   sp   

原文地址:http://www.cnblogs.com/zoniony/p/4050903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!