青蛙過河

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

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