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

 

你可能感兴趣的:(优化)