zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    jquery $.each遍历json数组方法
    JQuery插件编写
    创建JAVASCRIPT对象3种方法
    微信开发流程
    有关索引那点事
    获取数据库内所有的表和表内字段的信息
    asp.net MVC4 异步文件上传
    QT学习:01 工程文件详解
    QT学习:00 介绍
    Linux 系统编程 学习 总结
  • 原文地址:https://www.cnblogs.com/konjak/p/6018633.html
Copyright © 2011-2022 走看看