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