青蛙过河 高手请进

zhoufuguo8802 2008-08-20 10:32:06
青蛙过河
Description
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
输入
输入包含多组数据,每组数据第一行有一个正整数L(1 <= L <= 20000),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。输入以一个0结束。
输出
对每组数据输出一行,这一行只包括一个整数,表示青蛙过河最少需要踩到的石子数。
请大虾指教(说明C++代码)
...全文
865 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxqing99 2008-08-21
  • 打赏
  • 举报
回复
问题貌似还可以用最短路问题求解
0表示起点,L表示终点,每一个整数点表示一个节点
i点可跳到的点与i点通路
将有石头的点所在的边上给个大权(比如10000),其他边上给个小权(比如1)
这样只要求出最短路然后对10000求余加上除以10000即得出所需的数即为步数
最短路问题可以用Dijkstra方法求解,效率较动态规划会高点。
guzhilei1986 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hxqing99 的回复:]
问题貌似还可以用最短路问题求解
0表示起点,L表示终点,每一个整数点表示一个节点
i点可跳到的点与i点通路
将有石头的点所在的边上给个大权(比如10000),其他边上给个小权(比如1)
这样只要求出最短路然后对10000求余加上除以10000即得出所需的数即为步数
最短路问题可以用Dijkstra方法求解,效率较动态规划会高点。
[/Quote]
就是哦,好像可以。
guzhilei1986 2008-08-20
  • 打赏
  • 举报
回复
输入包含多组数据,每组数据第一行有一个正整数L(1 <= L <= 20000),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。

看看数据量哦,6楼的代码相当于深度搜索,算一下时间复杂度。
guzhilei1986 2008-08-20
  • 打赏
  • 举报
回复
楼上的代码的效率很低
xianyuxiaoqiang 2008-08-20
  • 打赏
  • 举报
回复
大概算法如下:没有运行过.楼主可作参考
int f(int s,int t,int start,int end){//start end分别表示当前位置坐标和终点(end==L)
  if(start>=end)return 0;//递归在此结束
int min=0;
int num=0;
num=f(s,t,start+s,end);
if(status[start+i]==STONE){//status[]是记录坐标上是否有石头的数组
num++;
}
min=num;
for(int i=s+1;i<=t;i++){
num=f(s,t,start+i,end);//计算跳过i格后至少要踩多少石头
if(status[start+i]==STONE){//此处是石头个数增加的源泉
num++;
}
if(num<min){//调整最小值
min=num;
}
}
return min;//返回当前位置到终点最少踩到的石头数
}
zhoufuguo8802 2008-08-20
  • 打赏
  • 举报
回复
声明下:这个不是作业题。
guzhilei1986 2008-08-20
  • 打赏
  • 举报
回复
dp
d[20011][11];
d[i][j]//i表示桥上的某一点,j表示上一次跳了j的距离到达i点。
如果i点有石头,那么
d[i][j]=min{d[i-k][k]}+1;//k为[s,t]之间的值。
如果i点没有石头,那么
d[i][j]=min{d[i-k][k]};

答案应该是min{ d[l+1到l+T][S到T] };
楼主试一下。
wjb_yd 2008-08-20
  • 打赏
  • 举报
回复
贪心算法,每次都跳到能够得到的最远的那个石子,这样跳可以保证最优
veloting 2008-08-20
  • 打赏
  • 举报
回复
上次的作业题分还没结呢,又出来新题目了の- -
self_control 2008-08-20
  • 打赏
  • 举报
回复
这个不是sysu西西里上的题目么- -!
动态规划做出来的...
勇敢的天牛 2008-08-20
  • 打赏
  • 举报
回复
好麻烦的作业题...
e_sharp 2008-08-20
  • 打赏
  • 举报
回复
mark先

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧