递推关系求解(HDU 2047+HDU 2045)

HDU 2047-阿牛的EOF牛肉串
因为两个O不能连在一起,所以分别考虑两种单独的情况。
设当长度为n时的x[n]=a[n]+b[n],其中a[n]代表长度为n时且末尾为O的情况总和,b[n]代表长度为n时末尾不为O的情况总和。
那么现在开始分情况讨论:
当长度为n,末尾为O时,再加一个单位的长度有2种加法,即E,F;
当长度为n , 末尾不为O时,再加一个单位的长度有3种加法,即E,O,F;
所以:x[n+1]=a[n+1]+b[n+1]=2*a[n]+3*b[n]=2*x[n]+b[n];
而b[n]又由x[n-1]推来,x[n-1]=a[n-1]+b[n-1],
在长度为n-1且末尾为O时,要将它变成长度为n且末尾不为O有2种方法(E,F),即2*a[n-1];
同理,在长度为n-1且末尾不为O时,要将它变成长度为n且末尾不为O有2种方法(E,F),即2*b[n-1];
所以:
x[n+1]=2*x[n]+b[n]=2*x[n]+2*x[n-1];

int main()
{
    arr[1]=3;
    arr[2]=8;
    for(int i=3;i<N;i++) arr[i]=2*arr[i-1]+2*arr[i-2];
    int n;
    while(~scanf("%d",&n))
    {
        printf("%lld\n",arr[n]);
    }
    return 0;
}

HDU-不容易系列之(3)—— LELE的RPG难题

同理,当长度为n时为x[n],设三种颜色为A,B,C。
由x[n]推出x[n+1]:
若长度为n时,序列为 ABC..BAC,那么在后面加一个,只有一种加法,因为既要与开头不一样又要与末尾不一样,所以只能加B,因此从n变为n+1只有一种方法。
然而,还有种情况忽略了,就是当长度为n-1时,序列为ABC..CB时,若在其后加一个A变成ABC..CBA 是不符合题意的,但是我们可以在后面加两个让其变得有意义,如:ABC..CBAC或者ABC..CBAB,可得出从n-1变为n+1有两种方法。
所以,可以推出公式:
x[n]=x[n-1]+2*x[n-2];

int main()
{
    arr[1]=3;
    arr[2]=arr[3]=6;
    for(int i=4;i<N;i++)
    {
        arr[i]=arr[i-1]+2*arr[i-2];
    }
    int n;
    while(~scanf("%d",&n))
    {
        printf("%lld\n",arr[n]);
    }
    return 0;
}

That’s all :)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值