青蛙过河

一条长度为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];
	}
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章