关键词:
原题链接
题意:分析:因为题目没有要求起点,也就是二维数组任意一个位置都可以作为起点向四周发散,所以想到用搜索。
可以用深度优先搜索算法解决,需要另设一个二维数组存储当前位置是否走过。
详细解释见代码。
#include<iostream>
int a[105][105],d[105][105];
int n,m,ans=0;
using namespace std;
bool check(int a,int b)//判断该位置是否越界
if(a<=0||b<=0||a>n||b>n)
return 0;
else return 1;
int dir[4][2]= -1,0,0,-1,1,0,0,1;//控制四个方向的移动
int dfs(int x,int y)
if(d[x][y])//如果走过了,直接返回该位置可构建的长度即可。
return d[x][y];
int num=0;//这里是把x,y位置当做起点记录
for(int i=0; i<4; i++)//4个方向循环
int newx=x+dir[i][0];
int newy=y+dir[i][1];
if(check(newx,newy)&&a[x][y]<a[newx][newy])
num=max(dfs(newx,newy),num);//找到四个方向中最长的路径
num++;//当前位置,长度在之前的基础上加一
return d[x][y]=num;//返回现在的长度
int main( )
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
ans=max(ans,dfs(i,j));//从所有起点里找到最大值
cout<<ans<<endl;
这个题有点像Red and Black
DFS做法:
#include<bits/stdc++.h>
using namespace std;
char room[23][23];
int dir[4][2]= -1,0,0,-1,1,0,0,1;
int Wx, Hy, num;
#define CHECK(x, y) (x<Wx && x>=0 && y >=0 && y<Hy)
struct node
int x,y;
;
void DFS(int dx, int dy)
room[dx][dy] = '#';
num++;
for(int i = 0; i < 4; i++)
int newx = dx + dir[i][0];
int newy = dy + dir[i][1];
if(CHECK(newx, newy) && room[newx][newy] == '.')
DFS(newx, newy);
int main()
int x, y, dx, dy;
while(cin>>Wx>>Hy)
if(Wx==0&&Hy==0)
break;
for (y = 0; y < Hy; y++)
for (x = 0; x < Wx; x++)
cin >> room[x][y];
if(room[x][y] == '@')
dx = x;
dy = y;
num = 0;
DFS(dx, dy);
cout << num << endl;
return 0;
BFS做法:
#include<bits/stdc++.h>
using namespace std;
char room[23][23];
int dir[4][2]=
-1,0,//向左
0,-1,//向上
1,0,//向右
0,1//向下
;
int Wx,Hy,num;
#define CHECK(x,y)(x<Wx&&x>=0&&y>=0&&y<Hy
struct node
int x,y;
;
void BFS(int dx,int dy)
num=1;
queue<node>q;
node start,next;
start.x=dx;
start.y=dy;
q.push(start);
while(!q.empty())
start=q.front();
q.pop();
for(int i=0;i<4;i++)
next.x=start.x+dir[i][0];
next.y=start.y+dir[i][1];
if(CHECK(next.x,next.y)&&room[next.x][next.y]=='.')
room[next.x][next.y]='#';
num++;
q.push(next);
int main()
int x,y,dx,dy;
while(cin>>Wx>>Hy)
if(Wx==0&&Hy==0)
break;
for(y=0;y<Hy;y++)
for(x=0;x<Wx;x++)
cin>>room[x][y];
if(room[x][y]=='@')
dx=x;
dy=y;
num=0;
BFS(dx,dy);
cout<<num<<endl;
return 0;
p1434[shoi2002]滑雪dfs(代码片段)
题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一... 查看详情
p1434[shoi2002]滑雪(代码片段)
Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给... 查看详情
shoi2002滑雪(代码片段)
题面Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数... 查看详情
p1434滑雪
P1434滑雪题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域... 查看详情
[shoi2002]滑雪(记忆化搜索模版)(代码片段)
题目链接:https://www.luogu.com.cn/problem/P1434 想法:记忆化搜索板子题:#include<algorithm>#include<string>#include<string.h>#include<vector>#include<map>#include<stack>#include<set>#include<queue>#include<math.h>#include&l... 查看详情
p1434滑雪
题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二... 查看详情
[shoi2002]滑雪-题解报告(代码片段)
题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二... 查看详情
洛谷p1434滑雪
题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二... 查看详情
洛谷——p1434滑雪
https://www.luogu.org/problem/show?pid=1434#sub题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一... 查看详情
搜索洛谷p1434滑雪
P1434滑雪题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。... 查看详情
周末学习总结(21.10.23)
...问题:LIS与LCS字符串和多维数组学习笔记P1434[SHOI2002]滑雪心心念念的洛谷账号终于能注册了,再也不用干看着不能交代码了,激动的我先上去见见世面,(看了普及+/提高的简单数论题),好吧,... 查看详情
cogs1224.[shoi2002]百事世界杯之旅(期望概率)
COGS1224.[SHOI2002]百事世界杯之旅★ 输入文件:pepsi.in 输出文件:pepsi.out 简单对比 时间限制:1s 内存限制:128MB 【问题描述】 “……在2002年6月之前购买的百事任何饮料的瓶盖上都... 查看详情
shoi2002百事世界杯之旅|概率论(代码片段)
题目:SHOI2002若当前已经有了x种,再买一个买到不一样的概率为(n-x)/n,要使这个概率变成1,则至少再买n/(n-x)瓶。1#include<cstdio>2#include<string>34longlongmax(longlongx,longlongy)5returny<x?x:y;678longlonggcd(longlongx,longlongy 查看详情
luogup1291[shoi2002]百事世界杯之旅
题目链接luoguP1291[SHOI2002]百事世界杯之旅题解设\(f[k]\)表示还有\(k\)个球员没有收集到的概率再买一瓶,买到的概率是\(k/n\),买不到的概率是\((n-k)/k\)那么\(f[k]=f[k]*(n-k)/n+f[k-1]*k/n+1\)移向一下\(f[k]=f[k-1]+n/k\)代码#include<cstdio>#inclu... 查看详情
shoi2002百事世界杯之旅(代码片段)
题目链接:戳我看到期望,想着不要从前转移。一次后能买到不同种类的概率为\(\fracn-in\)两次后能买到不同种类的概率为\(\fracin\times\fracn-in\)n次后能买到不同种类的概率为\((\fracin)^n\times\fracn-in\)设总期望为\(E=\fracn-in\times1+\fracin\... 查看详情
p1291[shoi2002]百事世界杯之旅(概率)(代码片段)
P1291[SHOI2002]百事世界杯之旅设$f(n,k)$表示共n个名字,剩下k个名字未收集到,还需购买饮料的平均次数则有:$f(n,k)=fracn-kn*f(n,k)+frackn*f(n,k+1)+1$移项整理,可得:$f(n,k)=f(n,k+1)+fracnk$根据递推式,可得:$f(n,0)=nsum_k=1^nfrac1k$蓝后g 查看详情
p1291[shoi2002]百事世界杯之旅(代码片段)
题目描述“……在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯。还不... 查看详情
●洛谷p1291[shoi2002]百事世界杯之旅
题链:https://www.luogu.org/recordnew/show/5861351题解:dp,期望 定义dp[i]表示还剩下i个盖子没收集时,期望还需要多少次才能手机完。 初始值:dp[0]=0 显然对于一个状态,我们随机得到一个盖子,有两种可能: 1.得到了曾经没有的盖子... 查看详情