一條長度爲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];
}
}