首页 > 代码库 > 【记忆化搜索+优化】10411 - SKAKAVAC

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

 

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