题意:初始1个红气球,每小时后,1个红气球会变成3个红气球和1个蓝气球,而1个蓝气球会变成4个蓝气球。问经过N小时后,第L~R行一共有多少个红气球。
解法:问行数就定义f[i][j]表示 i 小时后前 j 行的红气球数。分情况讨论后就可得出递推方程。
注意——1.数组开不小就时间换空间,递归替代递推求解;2.要另外定义一个c函数,c(i)表示f[i][1<<i],否则每次都至少要算2^i,会TLE。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<queue> 7 using namespace std; 8 const int N=30; 9 typedef long long LL; 10 11 LL c(int i) {return i?3*c(i-1):1;} 12 LL f(int i,int j) 13 { 14 if (!j) return 0; 15 if (!i) return 1; 16 if (i==1) return (j==1)?2:3; 17 int k=1<<(i-1); 18 if (j<=k) return 2*f(i-1,j); 19 return 2*c(i-1)+f(i-1,j-k); 20 } 21 int main() 22 { 23 int T; 24 scanf("%d",&T); 25 for (int kase=1;kase<=T;kase++) 26 { 27 int n,l,r; 28 scanf("%d%d%d",&n,&l,&r); 29 printf("Case %d: %lld ",kase,f(n,r)-f(n,l-1)); 30 } 31 return 0; 32 }