HDU 递推求解专题练习(For Beginner)解题报告

hdu 2044

点击打开链接

a[0]=1;a[1]=1

a[i]=a[i-1]+a[i-2]

斐波那契

hdu 2045

点击打开链接

1.第n-1格和第1格颜色不同 a[i]=a[i-1]

2.第n-1格和第1格颜色相同,那么先把剩下的1~n-2格涂好,即a[n-2]种,第n-1格颜色与第1格相同,不用考虑,第n格颜色有2种涂法,所以 a[i]=a[i-2]*2

3.a[1]=3;a[2]=6;a[3]=6;     注意:a[3]不符合公式,要从a[4]开始打表

   a[i]=a[i-1]+a[i-2]*2

hdu2046

点击打开链接

1.考虑a[i-1]和a[i-2]

2.最右边的2×2方格可以横着放两块,剩下的方格方案数就是a[i-2]

3.或者最右边1×2方格竖着放一块,剩下的方格方案数就是a[i-1]

4.a[1]=1;a[2]=2;

  a[i]=a[i-1]+a[i-2];

hdu 2047

点击打开链接

1.将最后一个字母分类讨论

2.最后一个字母是E或F,剩下的就是a[i-1]*2

3.最后一个字母是O,倒数第二个字母只能是E或F,对于1~n-2个字母就没有限制了,剩下的就是a[i-2]*2

4.a[1]=3;a[2]=8;

   a[i]=a[i-2]*2+a[i-1]*2;

hdu 2048

点击打开链接

1.错开排列问题,以下简化为选位置的问题,即选和之前不一样的位置

2.第一个选位置的人有n-1个位置可选 —— *(i-1)

3.第二个选位置的人有两种情况:

    1.选了第一个人之前的位置,那么剩下n-2个人的选位置问题又回到了起点,即之前的两人对后面都没有影响了——a[i-2]

    2.没有选第一个人之前的位置,这里可以看作第一个人选位置对后面的人没有影响——a[i-1]

4.a[1]=0;a[2]=1;

   a[i]=(a[i-1]+a[i-2])*(i-1);

5.最后还要除以总的方案,即n!

hdu 2049

点击打开链接

1.错开排列问题+排列组合

2.先从n个新郎中选出m个,C(m,n)

3.将这m个新郎错开排列

4.

#include<iostream>
using namespace std;
long long fun(int x)
{
    long long sum=1;
	for(int i=1;i<=x;i++)
	sum*=i;
	return sum;
}
 int main()
 {
 	long long a[21];
 	a[0]=0;a[1]=0;a[2]=1;//a[1]=0!!!
 	for(int i=3;i<21;i++)
 	{
 		a[i]=(i-1)*(a[i-2]+a[i-1]);
	 }
 	int c;
 	cin>>c;
 	while(c--)
 	{
 		int n,m;
 		cin>>m>>n;
 		cout<<fun(m)/fun(n)/fun(m-n)*a[n]<<endl;
 
	 }
 	return 0;
 }

hdu 2050

点击打开链接

1.公式非常硬核

2.可以参考分割区域问题汇总

3.a[0]=0;a[1]=2;a[2]=7;

   a[i]=2*i*i-i+1;

总结:将一个问题分解到可以变成一个全新的子问题,子问题之外的部分不对子问题产生任何影响,从而形成递推,主要考察分类讨论的能力。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值