几道递推题目

HDOJ 1465 不容易系列之一

/*
HDOJ 1465
错排公式与 _int64 类型的用法
*/
#include <stdio.h>

_int64 C[25];

_int64 Count(int n)
{
	if(C[n] != 0)
		return C[n];
	else
	{
		C[n-1]=Count(n-1);
		C[n-2]=Count(n-2);
		//下面是错排公式
		C[n]=(n-1)*(C[n-1]+C[n-2]);
		return C[n];
	}
}

int main()
{
	C[1]=0;
	C[2]=1;
	int n;
	while(scanf("%d",&n) != EOF)
	{
		printf("%I64d\n",Count(n));
	}
	return 0;
}

HDOJ 2044 一只小蜜蜂

/*
HDOJ 2044
f[n]表示的是输入的两个数 a,b之间的差值,通过观察,
可以得出 f[n]=f[n-1]+f[n-2] (n>2)
*/

#include <stdio.h>

int main()
{
	_int64 f[55];
	f[0]=1;
	f[1]=1;
	f[2]=2;
	for(int i=3;i<51;i++)
		f[i]=f[i-1]+f[i-2];
	int n,a,b;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&a,&b);
		a=b-a;
		printf("%I64d\n",f[a]);
	}
	return 0;
}

HDOJ 2045 LELE的RPG问题

/*
HDOJ 2045 PRG难题
现在共有i个格子的时候,
如果第i-1个和第一个相同,那么第i-2个肯定就和第一个不一样
	此时,最后一个可以有两种涂色方案
如果第i-1个和第一个不一样,那么最后一个格子只有一种颜色可以涂
所以 f[i]=f[i-1]+2*f[i-2] (i>3)
*/

#include <stdio.h>

int main()
{
	int n,i,j;
	_int64 f[51];
	f[1]=3;
	f[2]=6;
	f[3]=6;
	for(i=4;i<51;i++)
	{
		f[i]=f[i-1]+2*f[i-2];
	}		
	while(scanf("%d",&n) != EOF)
	{
		printf("%I64d\n",f[n]);
	}
	return 0;
}

HDOJ 2046 骨牌铺方格

/*
HDOJ 2046 骨牌铺方格
有1*n个方格的时候,可以是在n-1个方格的时候,最后加上一张
也可以是在n-2个方格的时候,加上两张横放的。如果是加上两张竖放的
那就和竖放一张那种方案重复了。
所以 f(n)=f(n-1)+f(n-2); 斐波那契数列
*/

#include <stdio.h>

int main()
{
	_int64 f[55];
	int i,n;
	f[0]=1;
	f[1]=1;
	f[2]=2;
	f[3]=3;
	for(i=4;i<=50;i++)
		f[i]=f[i-1]+f[i-2];
	while(scanf("%d",&n) != EOF)
		printf("%I64d\n",f[n]);
	return 0;
}

HDOJ 2047 阿牛的EOF牛肉串

/*
HDOJ 2047 
f[n]表示长度为n的时候的方案数目。
加入第n个字符的时候,有几种选择,要看它前面的
当第n-1个是O的时候,那么它后面只可以是E or F,有两种选择
并且此时,第n-2个一定是 E/F。此时 f[n]=2*f[n-2];
当第n-1个不是O的时候,那么它的后面可以是 EOF 中任意一个。
此时,f[n]=3*f[n-1];起初我也认为,这样答案不就是 f[n]=3*f[n-1]+2*f[n-2]吗?
但是,其实这两种讨论是有重复的地方的,那就是在第一种情况中,
第n-2个是E/F的时候,和第二种情况的第n-1个是E/F的,情况是有重复的
当第n-2个是E/F时,包含了一种第n-1个E/F时的一种情况,所以要减去一个f[n-1];
所以 f[n]=2*(f[n-2]+f[n-1]);
*/

#include <stdio.h>

int main()
{
	int n,i;
	
	_int64 f[41];
	
	f[1]=3;
	f[2]=8;
	f[3]=22;
	
	for(i=4;i<41;i++)
		f[i]=2*(f[i-1]+f[i-2]);

	while(scanf("%d",&n) != EOF)
		printf("%I64d\n",f[n]);
	
	return 0;
}

HDOJ 2050 折线分割平面

#include <iostream>
using namespace std;

int Count(int n)
{
	if(n == 1)
		return 2;
	else
	{
		int fn;
		fn=Count(n-1)+4*(n-1)+1;
		return fn;
	}
}

int main()
{
	int nCase,n;
	cin>>nCase;
	while(nCase--)
	{
		cin>>n;
		cout<<Count(n)<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值