hdu 1438钥匙计数

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1438

解题思路:
令a[i]数组表示i个槽的钥匙总数
b[i]数组表示i个槽且第i个槽为1、4的钥匙情况
1.当前 i-1 个槽可以组成钥匙时,第 i 个槽对于1234均可,故有a[i-1]*4种

2.(欠缺种类)当前 i-1 个槽不能组成钥匙时,假设前 i-1 个槽均为2、3,那么无论最后一个槽放1还是4均无法满足条件(深度之差不满足),故 前 i-1 个槽均为1、4 ,则第 i 个槽只能使用 2、3,且排除全是1或者4的情况,共有
(2^(i-1)-2)*2 = 2^i - 4种情况

3.(欠缺深度)当前 i-1 个槽不能组成钥匙时,前 i-2个槽可以为1234,此时最后两位为14或41即可满足题意,但是要减去全为1或者4的情况(无法满足3种深度)和当第 i-1 槽存放 1或者4就成为合法钥匙的情况即b[i-1](重复计算,若第i-1位确定为1或4,则第i位也随之确定),所得即为temp,显然b[i] 即为 i-1的钥匙加上1或者4的情况再加上temp类型的情况
temp = (4^(i-2) - 2^(i-2))*2 -b[i-1]
b[i] = a[i-1]*2 + temp

此处只选最后两个槽的原因是如果任选中间两个槽存放14,那么就成为合法钥匙了

#include <stdio.h>
#include <math.h>

int main() {
    int n,i,j;
    __int64 a[32],b[32],temp;
    a[2] = 0;
    b[2] = 0;
    for (i = 3;i < 32;i ++) {
        a[i] = a[i-1] * 4 + ((__int64)pow(2,i-1) - 2) * 2;
        temp = ((__int64)pow(4,i-2) - (__int64)pow(2,i-2))*2 - b[i-1];
        a[i] += temp;
        b[i] = a[i-1] * 2 + temp;       
    }
    for (i = 2;i < 32;i ++) {
        printf("N=%d: %I64d\n",i,a[i]);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值