【uva 12627】Erratic Expansion(算法效率--递推)

题意:初始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 }
原文地址:https://www.cnblogs.com/konjak/p/6018633.html