您的位置:首页 > 其它

hdu 1438钥匙计数

2017-03-14 00:51 197 查看
链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  杭电 acm