一条长度为L的小河上飘着一些荷叶,青蛙要踩着这些荷叶过河。由于河宽和青蛙一次跳过的距离都是正整数,我们可以把青蛙可能到达的点看成是数轴上的一串整点:0,1,2,。。。,L。坐标为0的点在河的一次,坐标为L的点在河的另一侧。青蛙从坐标为0的点开始,不停的向坐标为L的点跳跃。一次跳跃的距离是s到t之间的任意正整数。当青蛙调到或者跳过坐标为L的点的时候,就算青蛙已经跳过了河。
计算青蛙过河至少要踩到的荷叶数。
使用动态规划的方法,规划荷叶,将荷叶周围0~t-1的范围进行计算,看是否可以 跳到
当距离大于s*(s-1)的时候,则一定可以跳到,当小于这个的时候,需要逐个计算
代码如下
package dynamicProgramming;
import java.io.*;
import java.util.*;
public class FrogRiver {
int x[]=new int[101];
int a[][]=new int[101][10];
boolean b[]=new boolean[101];
int s,t,m,l,n;
int best;
public FrogRiver()
{
Scanner scan=new Scanner(System.in);
s=scan.nextInt();
t=scan.nextInt();
m=scan.nextInt();
l=scan.nextInt();
for(int i=1;i<=m;i++)
{
x[i]=scan.nextInt();
}
n=m;
while(x[n-1]>l)
n--;
if(s==t)
{
best=0;
for(int i=1;i<=n;i++)
{
if(x[i]%s==0)
best++;
}
System.out.println(best);
System.exit(0);
}
b[0]=true;
for(int i=1;i<=90;i++)
{
for(int j=s;j<=t;j++)
{
if(i-j>0)
b[i]=b[i]||b[i-j];
}
}
x[0]=0;
a[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=t-1;j++)
{
if(x[i]-j<x[i-1])
{
a[i][j]=a[i-1][j-x[i]+x[i+1]];
}
else
{
for(int v=0;v<t-1;v++)
{
if(can(x[i]-j-x[i-1]+v)&&(a[i-1][v]<a[i][j]))
{
a[i][j]=a[i-1][v];
}
}
if(j==0)
{
a[i][j]++;
}
}
}
}
best=n+1;
for(int i=0;i<=t-1;i++)
{
if(a[n][i]<best)
best=a[n][i];
}
System.out.println(best);
}
boolean can(int v)
{
if(v<0)
return false;
else if(v>s*(s-1))
{
return true;
}
else
return b[v];
}
}