sdut oj实验3——递推

A - 养兔子

Description

一对成熟的兔子每天能且只能产下一对小兔子,每次都生一公一母,每只小兔子的成熟期是1天,小兔子出生后隔一天才能再生小兔子。第一天某人领养了一对成熟的兔子,一公一母,请问第N天以后,他将会得到多少对兔子。

Input

输入为一个整数n(1 ≤ n ≤ 90)。

Output

对应输出第n天有几对兔子(假设没有兔子死亡现象,而且是一夫一妻制)。

Sample

Input 

2

Output 

2

Hint

数据类型可以用64位整数:long long

#include<iostream>
using namespace std;
const int N = 100;
long long d[N];
int main()
{
    int n;
    cin >> n;
    d[1] = 1;
    d[2] = 2;
    for(int i = 3; i <= n; i++){
        d[i] = d[i-1] + d[i-2];
    }
    cout << d[n];
    return 0;
}

B - 母牛的故事

Description

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

Input

输入为一个整数n(0< n< 55)。

Output

输出在第n年的时候母牛的数量。

Sample

Input 

5

Output 

6
#include<iostream>
using namespace std;
const int N = 60;
long long  d[N];
int main()
{
    int n;
    cin >> n;
    d[1] = 1;
    d[2] = 2;
    d[3] = 3;
    for(int i = 4; i <= n; i++){
        d[i] = d[i-1] + d[i-3];
    }
    cout << d[n];
    return 0;
}

C - 鬼吹灯之龙岭迷窟

Description

    在古希腊时期,有一天毕达哥拉斯走在街上,在经过铁匠铺前他听到铁匠打铁的声音非常好听,于是驻足倾听。他发现铁匠打铁节奏很有规律,这个声音的比例被毕达哥拉斯用数学的方式表达出来。

    这个比例就叫做黄金分割比,它是指将整体一分为二,较大部分与整体部分的比值等于较小部分与较大部分的比值,其比值约为0.6180339887。这个比例被公认为是最能引起美感的比例,因此被称为黄金分割。 

    现在小玉有一个正整数数列,这个数列的前一项和后一项的比值十分趋近于黄金分割比,即(a[i])/(a[i+1])~ 0.6180339887,(i>=1),可是她只知道数列的第一项是5,现在她想通过已有条件推断出数列的任意项,请你帮助她编写一个程序计算。

Input

输入一个整数n(1<=n<=20)。

Output

输出一个数,代表这个数列的第n项a[n]。

Sample

Input 

1

Output 

5
#include<iostream>
using namespace std;
int a[30];
int main()
{
	int n, i;
	a[1] = 5;
	a[2] = 8;
	while(cin >> n){
		for(i = 3; i <= n; i++){
			a[i] = a[i-1] + a[i-2];
		}
		cout << a[n] << endl;
	}
	return 0;
}

**这题真的很迷啊,又不标明,别人怎么知道是多组输入?

D - 骨牌铺方格

Description

在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

Input

输入包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0< n<=50)。

Output

输出铺放方案的总数。

Sample

Input 

3

Output 

3
#include<iostream>
using namespace std;
const int N = 100;
long long d[N];
int main()
{
    int n;
    cin >> n;
    d[1] = 1;
    d[2] = 2;
    for(int i = 3; i <= n; i++){
        d[i] = d[i-1] + d[i-2];
    }
    cout << d[n];
    return 0;
}

 **em。。。这几个题的代码都很简单而且还都是一样的!所以思考的时间会多一些

E - 爬楼梯

Description

小明是个非常无聊的人,他每天都会思考一些奇怪的问题,比如爬楼梯的时候,他就会想,如果每次可以上一级台阶或者两级台阶,那么上 n 级台阶一共有多少种方案?

Input

输入只有一行为一个正整数 n(1 ≤ n ≤ 50)。

Output

输出符合条件的方案数。
注意:64-bit 整型请使用 long long 来定义,并且使用 %lld 或 cin、cout 来输入输出,请不要使用 __int64 和 %I64d。

Sample

Input 

4

Output 

5
#include<iostream>
using namespace std;
const int N = 100;
long long d[N];
int main()
{
    int n;
    cin >> n;
    d[1] = 1;
    d[2] = 2;
    for(int i = 3; i <= n; i++){
        d[i] = d[i-1] + d[i-2];
    }
    cout << d[n];
    return 0;
}

F - 三国佚事——巴蜀之危

Description

话说天下大势,分久必合,合久必分。。。却道那魏蜀吴三国鼎力之时,多少英雄豪杰以热血谱写那千古之绝唱。古人诚不我欺,确是应了那句“一将功成万骨枯”。 
是夜,明月高悬。诸葛丞相轻摇羽扇,一脸愁苦。原来是日前蜀国战事吃紧,丞相彻夜未眠,奋笔急书,于每个烽火台写下安排书信。可想,这战事多变,丞相运筹 帷幄,给诸多烽火台定下不同计策,却也实属不易。
谁成想这送信小厮竟投靠曹操,给诸葛丞相暗中使坏。这小厮将每封书信都投错了烽火台,居然没有一封是对的。不多时小厮便被抓住,前后之事却也明朗。这可急坏了诸葛丞相,这书信传错,势必会让蜀军自乱阵脚,不攻自破啊! 诸葛丞相现在想知道被这小厮一乱,这书信传错共有多少种情况。

Input

输入一个正数n,代表丞相共写了n(1 <= n <= 20)封书信。

Output

输出书信传错的情况数。

Sample

Input 

3

Output 

2
#include<iostream>
using namespace std;
long long a[30];// 一定一定不要忘了用长整型! 
int main()
{
	int n, i;
	a[1] = 0;
	a[2] = 1;
	while(cin >> n){
		for(i = 3; i <= n; i++){
			a[i] = (i-1) * (a[i-1] + a[i-2]);
		}
		cout << a[n] << endl;
	}
	return 0;
}

** 还是栽在了长整型这里.....

G - 王小二切饼

Description

王小二自夸刀工不错,有人放一张大的煎饼在砧板上,问他:“饼不许离开砧板,切n(1<=n<=100)刀最多能分成多少块?”

Input

输入切的刀数n。

Output

输出为切n刀最多切的饼的块数。

Sample

Input 

100

Output 

5051

Hint

#include<iostream>
using namespace std;
const int N = 110;
int  d[N];
int main()
{
    int n;
    cin >> n;
    d[1] = 2;
    d[2] = 4;
    for(int i = 3; i <= n; i++){
        d[i] = d[i-1] + i;
    }
    cout << d[n];
    return 0;
}

H - C语言实验——拍皮球

Description

小瑜3岁了,很喜欢玩皮球,看来今后喜欢打篮球的^_^。最近她发现球从手中落下时,每次落地后反跳回原高度的一半,再落下,每次球落地时数球跳了几次,数到n次时爸爸在边上喊停,问小瑜现在球到底总共走了多少距离,小瑜故作沉思状,爸爸又问接下来小球能跳多高啊,小瑜摇摇头,心想还没跳我怎么知道啊,难道爸爸是神啊!这时的你在边上出主意想给小瑜写个程序计算一下,因此任务就交给你啦!假设球的初始高度为h,计算第n次落地时球经过的距离,以及落地后反弹能有多高。

Input

每行有两个数,球的初始高度h(h<=100)和球落地的次数n(n <= 10),用空格分隔。

Output

输出第n次反弹时球经过的距离和球最后的高度,保留小数点后2位。

Sample

Input 

100 1

Output 

100.00 50.00
#include<stdio.h>
double x[15], end[15];
int main()
{
	double h;// 输入的h也得是double类型的!
	int i, n;
	while(~scanf("%lf %d", &h, &n)){
		x[0] = 0;
		end[0] = h;
		x[1] = h;
		end[1] = h / 2.0;
		for(i = 2; i <= n; i++){
			x[i] = x[i-1] + 2.0 * end[i-1];
			end[i] = end[i-1] / 2.0;
		}
		printf("%.2lf %.2lf\n", x[n], end[n]);
	}
	return 0;
} 
#include<bits/stdc++.h>
using namespace std;
double x[15], end[15];
int main()
{
	double h;
	int i, n;
	while(cin >> h >> n){
		cout << fixed << setprecision(2);
		x[0] = 0;
		end[0] = h;
		x[1] = h;
		end[1] = h / 2.0;
		for(i = 2; i <= n; i++){
			x[i] = x[i-1] + 2.0 * end[i-1];
			end[i] = end[i-1] / 2.0;
		}
		cout << x[n] << " " << end[n] << endl;
	}
	return 0;
} 

**保持微笑~啊啊啊啊为什么CE啊?? 

I - 蟠桃记

Description

孙悟空在大闹蟠桃园的时候,第一天吃掉了所有桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。这下可把神仙们心疼坏了,请帮忙计算一下,第一天开始吃的时候一共有多少个桃子?

Input

输入包含一个正整数n(1≤n≤30),表示只剩下一个桃子的时候是在第n天发生的。

Output

输出第一天开始吃的时候桃子的总数。

Sample

Input 

2

Output 

4
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int a[n];
	a[n] = 1;
	for(int i = n; i >= 1; i--){
		a[i-1] = (a[i] + 1) * 2;
	}
	cout << a[1];
	return 0;
}

J - 马拦过河卒

Description

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

Input

一行四个数据,用空格分隔,分别表示B点的坐标和马的坐标。

Output

一个数据,表示所有的路径条数。

Sample

Input 

6 6 3 3

Output 

6
/* 马拦过河卒
    我不会
*/
#include<bits/stdc++.h>
using namespace std;
int board[20][20];
long long ans[20][20];
int main()
{
    int horse_x[9] = {0, -2, -2, 2, 2, -1, -1, 1, 1};// 表示出马以及马所控制的点
    int horse_y[9] = {0, 1, -1, 1, -1, 2, -2, 2, -2};// 这种方法谁能想到呢
    int n, m, x, y;
    cin >> n >> m >> x >> y;
    for(int i = 0; i < 16; i++){
        for(int j = 0; j < 16; j++)
            board[i][j] = 1;
    }// 先假设棋盘上所有的点都能通行
    for(int i = 0; i < 9; i++){
        if(x + horse_x[i] >= 0 && x + horse_x[i] <= 15 && y + horse_y[i] >= 0 && y + horse_y[i] <= 15){
            board[x + horse_x[i]][y + horse_y[i]] = 0;
        }
    }// 删掉不能通行的点
    for(int i = 0; i < 16; i++){
        if(board[0][i] == 1){
            ans[0][i] = 1;
        }
        else
            break;
    }// 如果棋盘的第一行上每个点都能通行,那答案就多一个?
    for(int i = 0; i < 16; i++){
        if(board[i][0] == 1){
            ans[i][0] = 1;
        }
        else
            break;
    }// 同上
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(board[i][j] == 1){
                ans[i][j] = ans[i-1][j] + ans[i][j-1];
            }
        }
    }// 用到递推了,我真的不懂。。。
    cout << ans[n][m];
    system("pause");
    return 0;
}

 ** 对于这道题的第一反应难道不应该是高中数学??

     不理解这个递推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值