青蛙跳石头游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
F[i]=min{F[i-T]到F[i-s]}+a[i];//a[i]表示第i个位置有没有石子,有就
是1,没有就是0
F[10]=a[10]+min(F[7]到F[8])
《1》补前面T个,F[0]=0; F[1]=min{(F(i-t)到F(i-s)}+a[1]...
数据量10(9)时超时。
****:《2》根据石子的位置进行坐标压缩
L=10(9)而石头只有100个,最终的结果只与石头的个数有关,为了不超时,
可以压缩两个石头之间的间距。K=L%t+t;p=p+k;//p表示第二块石头的位置
如果不加t则当L%t==0(即k=0)时,第二块石头的位置就与前面一块重合了,
同时:***因为p上面有石头,则p+1,p+2...p+t的记忆数组(不重复,不能确定),而当p+t+1...到后面时都重复p,p+1,...p+t的值。
如
For(i=1;i<=M;i++)
{
L=stone[i]-stone[i-1];k=L%t+t;
If(L
p = p+k; map[p]=1;//压缩后的第二块石头位置
}
//最后影响整个L的值即为:从坐标1到最后一块石头p+t的填记忆数组(自己+潜力最大的合作伙伴 j>=0:f[i]={i-t到i-s中的最小值}+自己map[i])
故初始化时L: 不能到达的顶点全是无穷大
<1>f(-t,...-1)都是无穷大
<2>f(0)=0 坐标原点是青蛙的起始位置,不放石头,记忆数组为0
<3>f(1...s-1)都是无穷大,青蛙第一个跳到的位置是s
*/
#include
#include
using namespace std;
#define max 100
ifstream in("123.txt");
ofstream out("青蛙游戏.txt");
int stone[max+1];
int map[20001];
int f[2011];
int s,t,m,l;
void sort()
{
int temp,i,j;
for(i=1;i
if(stone[i]>stone[j])
{
temp=stone[i];
stone[i]=stone[j];
stone[j]=temp;
}
cout<<"石头坐标排序后的位置为"<
cout<
void read()
{
in>>l>>s>>t>>m;
for(int i=1;i<=m;i++)
in>>stone[i];
for(int i=0;i<2001;i++)
map[i]=0;//坐标i 上都没有石头
for(int i=1;if[i]=55555;
f[0]=0;//坐标 原点 是0
}
int work()
{
int p,k,l,min;
sort();//石头的坐标位置排序
stone[0]=0;//把起点不放石头(把第一石头 放坐标原点 )便于计算后面石头的坐标
p=0;//第一个石头的坐标,从第一个石头开始就能压缩
for(int i=1;i<=m;i++)//对m个石头之间的距离进行压缩
{ //如果p上有石头,则到了p+t+1开始...p+2t就重复前面的值 了
l=stone[i]-stone[i-1];//相邻的两个石头之间的距离
k=t+l%t;
//当前压缩后的位置k=t[可以重复的最短距离]+l%t[不能确定的值]
if(l
p=p+k;///当前石子压缩的坐标p=前一个石子坐标的位置+K=t1+....2*t
map[p]=1;//p上有石头
}
//填f[i]记忆数组=自
己+潜力最大的合作伙伴的最小值
for(int i=1;i<=p+t;i++)//从坐标1直到最后一个石头+t
{
min=6666;//求最小初始化最大,
for(int j=i-t;j<=i-s;j++)//可以到达i的位置为:i-t..i-s
if((min>f[j])&&(j>=0))
min=f[j];//求出合作伙伴的最小值
f[i]=min+map[i]; //自己+合作伙伴
out<<"坐标为--"<}
min=1000;
for(int i=p+1;i<=p+t;i++)//求压缩后的最后一个石头的位置p
if(f[i]
return min;
}
int main()
{
read();
out<
}
/* 测试数据1:
10
2 3 5
2 3 5 6 7
输出 :2
测试数据2:
10000
1 5 100
4061 4062 4066 4065 4068 6356 4070 6832 4063 3688 4268 3854 4060 1530
3949 4064 1299 3377 2435 4069 2985 2978 2983 2986 2979 3235 2987 2751
3031 2981 4794 8545 3946 2988 6706 3718 9091 5657 5362 7000 4714 4713
7637 4718 4719 8677 4709 4710 8951 4711 6599 4717 4712 7558 940 7679 5401
4715 4716 9153 1018 1020 1016 1025 1024 1015 1019 7198 9163 1021 7944 1017
2594 1023 6139 2503 1022 2919 6712 1486 3740 3732 3733 2959 3731 3730 3736
2287 3737 1276 8941 3146 3735 6697 2884 9576 9134 9754 3734 3739
输出:6
*/