基本动态规划问题之母牛问题

问题描述:

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入:

输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。

n=0表示输入数据的结束,不做处理。

输出:

对于每个测试实例,输出在第n年的时候母牛的数量。

每个输出占一行。

示例输入:

2

4

5

0

示例输出:

2

4

6


问题分析:

先写几个看看

年数123456
母牛数量123469

则第i年的母牛数量cows(i)等于上一年的母牛数量cows(i-1)+新出生的母牛数量cows(i-3),即3年前的母牛数,现在可以都生意头小母牛。

代码:

package dynamicProgramming;

import java.util.Scanner;

public class Cow {
	
	public static int cows(int year) {
		switch(year) {
		case 1:  
			return 1; 
		case 2:
			return 2;
		case 3:
			return 3;
		default:
			return cows(year-1) + cows(year-3);		
		}
	}
	
	
	public static void main(String[] args) {
		int[] years = new int[32];//储存输入年数
		int count = 0;
		Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        do {
        	years[++count] = m;
        	m = in.nextInt();
        }while(m !=0);
        int i = 1;
        while(i<=count) {
        	System.out.println(cows(years[i++]));
        }
        
		
	}

}



问题来源:

http://acm.hdu.edu.cn/showproblem.php?pid=2018


相似问题:

蜜蜂爬蜂房问题

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。

其中,蜂房的结构如下所示。


输入描述:

输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。

输出描述:

对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。

示例输入:

2

1 2

3 6

示例输出:

1

3

问题分析:

假设开始于1,则爬到2只有1->2一条路径;1->3有1->3和1->2->3两条路径;1->4相当于先爬到2/3,再由2/3爬到4共三条路径。

故对于1——>i的可能路径数f(i)=f(i-1)+f(i-2),其中i>2;f(0)=0;f(1)=1;f(2)=2。

另,从a->b等效于1->1+b-a。



超级楼梯

到第i层楼梯f(i)的路径可以分为从第i-1层楼梯上一步到第i层楼梯(其中到第i-1层楼梯有f(i-1)中路径)或者从第i-2层楼梯跳到第i层楼梯(其中到第i-2层楼梯有f(i-2)中路径),故f(i)=f(i-1)+f(i-2),i>2.f(1)=1,f(2)=2;

平面分割

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页