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的情况,共有
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类型的情况
此处只选最后两个槽的原因是如果任选中间两个槽存放14,那么就成为合法钥匙了
解题思路:
令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; }
相关文章推荐
- hdu 1438 钥匙计数之一(DP状态压缩)
- HDU 1438 钥匙计数之一(状压DP->四维数组求满足要求的状态的方法数)
- hdu 1438 - 钥匙计数之一
- HDU-1438 钥匙计数之一
- hdu-1438 钥匙计数之一
- HDU - 1438:钥匙计数之一
- hdu1438 钥匙计数一
- 钥匙计数之一 - HDU 1438(状态压缩打表)
- HDU 1438 钥匙计数之一 递推+组合 简洁的做法
- hdu1438 钥匙计数之一
- hdu 1438 钥匙计数1
- hdu 1438 钥匙计数之一(DP状态压缩)
- HDU 1480 钥匙计数二
- 递推—杭电1438 钥匙计数之一(待解决)
- HDU---1480-钥匙计数之二
- 杭电1438 钥匙计数一
- hud 1438 钥匙计数之一
- HDU 1483 钥匙计数之一(详细过程)
- HDU yt13递推1008钥匙计数之一
- HDU 钥匙计数之一