[vijos1011]滑雪

暴搜

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5
 6 int num[505][505];
 7 int Ans=1,n,m;
 8 int fx[4]={0,0,1,-1};
 9 int fy[4]={1,-1,0,0};
10
11 void dfs(int x,int y,int len){
12     Ans=max(Ans,len);
13     for (int i=0;i<4;i++)
14       if (num[x][y]>num[x+fx[i]][y+fy[i]]&&num[x+fx[i]][y+fy[i]]!=-1)
15         dfs(x+fx[i],y+fy[i],len+1);
16 }
17
18 int main(){
19     freopen("ski.in","r",stdin);
20     freopen("ski.out","w",stdout);
21     scanf("%d%d",&n,&m);
22     memset(num,-1,sizeof(num));
23     for (int i=1;i<=n;i++)
24       for (int j=1;j<=m;j++)
25         scanf("%d",&num[i][j]);
26     for (int i=1;i<=n;i++)
27       for (int j=1;j<=m;j++){
28           bool is_ok=0;
29           for(int t=0;t<=3;t++)
30             if (num[i][j]>num[i+fx[t]][j+fy[t]]&&num[i+fx[t]][j+fy[t]]!=-1) is_ok=1;
31           if (is_ok==1) dfs(i,j,1);
32       }
33     printf("%d",Ans);
34     return 0;
35 }

直接搜索无法很好的处理重叠子问题,因此可采用记忆化搜索以减少时间

记忆化搜索

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5
 6 int f[505][505];//存储从(i,j)出发可滑的最长路径,避免重复搜索
 7 int num[505][505];
 8 int fx[4]={0,0,1,-1};
 9 int fy[4]={1,-1,0,0};
10
11 int dfs(int x,int y){
12     int tmp=0;
13     if (f[x][y]!=-1) return f[x][y];
14     for (int i=0;i<4;i++){
15         if (num[x][y]>num[x+fx[i]][y+fy[i]]&&num[x+fx[i]][y+fy[i]]!=-1)
16             tmp=max(tmp,dfs(x+fx[i],y+fy[i])+1);
17     }
18     if (tmp==0) {
19         f[x][y]=1;
20         return 1;
21     }
22     f[x][y]=tmp;
23     return tmp;
24 }
25 int main(){
26     int ans=1;
27     freopen("ski2.in","r",stdin);
28     freopen("ski2.out","w",stdout);
29     int n,m;
30     scanf("%d%d",&n,&m);
31     memset(num,-1,sizeof(num));
32     memset(f,-1,sizeof(f));
33     for (int i=1;i<=n;i++)
34       for (int j=1;j<=m;j++)
35         scanf("%d",&num[i][j]);
36     for (int i=1;i<=n;i++)
37       for (int j=1;j<=m;j++)
38         ans=max(ans,dfs(i,j));
39     printf("%d\n",ans);
40     return 0;
41 } 

时间: 2024-10-11 02:12:33

[vijos1011]滑雪的相关文章

[ACM] POJ 1088 滑雪 (记忆化搜索复习)

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 77763   Accepted: 28905 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17

P1434 滑雪

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

【POJ】1088滑雪

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 97335   Accepted: 36911 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17

滑雪与时间胶囊(bzoj 2753)

Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a180285喜欢用最短的滑行路径去访问尽量多的景点.如果仅仅访问一条路径上的景点,他会觉得数量太少.于是a180285拿出了他随身携带的时间胶囊.这是一种很神奇的药物,吃下之后可以立即回到

[SCOI2012]滑雪与时间胶囊

2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2362  Solved: 821[Submit][Status][Discuss] Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i

tyvj1004 滑雪

描述 trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行的路线必须向下倾斜.    例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一.例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条. 输入格式 输入文件 第1行: 两个数字r,c(1<=r,c<=100),表示矩阵的行列.第2..r+1行:每行c个数,表示这个矩阵. 输出格式 输出文件 仅一行: 输出1个整数,表示可

【SCOI2012】【BZOJ2753】滑雪与时间胶囊

2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Submit: 1524 Solved: 536 [Submit][Status][Discuss] Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i

poj1088滑雪(dfs+记忆化搜索、备忘录)

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

BZOJ 1571: [Usaco2009 Open]滑雪课Ski

Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S<=100)门滑雪课.第i节课始于M_i(1<=M_i<=10000),上的时间为L_i(1<=L_i<=10000).上完第i节课后,Bessie的滑雪能力会变成A_i(1<=A_i<=100). 注意:这个能力是绝对的,不是能力的增长值. Bessie买了一张地图,