zoukankan      html  css  js  c++  java
  • 2017"百度之星"程序设计大赛

    Pokémon GO

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 171    Accepted Submission(s): 104


    Problem Description
    众所周知,度度熊最近沉迷于 Pokémon GO。




    今天它决定要抓住所有的精灵球!

    为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都有一个精灵球。度度熊可以选择任意一个格子开始游戏,抓捕格子上的精灵球,然后移动到一个相邻的至少有一个公共点的格子上继续抓捕。例如,(2, 2) 的相邻格子有(1, 1), (2, 1) 和 (1, 2) 等等。

    现在度度熊希望知道将所有精灵球都抓到并且步数最少的方案数目。两个方案被认为是不同,当且仅当两个方案至少有一步所在的格子是不同的。
     
    Input
    第一行为T,表示输入数据组数。

    每组数据包含一个数N。

    ●1≤T≤100

    ●1≤N≤10000
     
    Output
    对每组数据输出方案数目,结果对 1 000 000 007 取模。
     
    Sample Input
    3
    1
    2
    3
    Sample Output
    2
    24
    96
    Source
    分析:

    说这道题目是一道dp题目。 不如说这是一道数学题目。

    递推公式比较复杂
    一共有两个递推数组:
    首先设Dn表示从左边或者右边的某个角出发,然后走遍所有格子回到同一列有多少种方法。
    明显D1=2,Dn=2*Dn-1
    所以Dn=2^n
    然后设An表示从某个角出发,走遍所有格子(不一定回到同一列)有多少种方法。
    An=Dn+2*An-1+4*An-2
    这个递推公式就用统计原理分析出来,分别对应三种不同的走法
    Dn对应从这个角走到下一列,然后走遍所有格子回到下一列,再回到这列的走法
    2*An-1表示直接走到这列的另一个角,然后再走其他的地方
    4*An-2表示走对角线方法走遍前两列,然后走其他的地方
    这样答案如果从四个角出发,总数就是4*An
    然后分析从某一列开始,假设第i列(1<i<n)
    则总数为2*(2*Di-1*An-i+2*Dn-i*Ai-1)
    对i从2到n-1全部加和,得到这部分答案
    两部分答案加起来,就是总数,经测试无误
    比赛是拿java乱搞的,emmmm,别介意啊QAQ
    下面给出AC代码:
     1 import java.math.BigInteger;
     2 import java.util.Scanner;
     3 
     4 public class Main{
     5 
     6     /**
     7      * @param args
     8      */
     9     public static void main(String[] args) {
    10         Scanner in=new Scanner(System.in);
    11         int mod=1000000007;
    12         while(in.hasNextInt())
    13         {
    14             int T=in.nextInt();
    15             for(int a=1;a<=T;a++)
    16             {
    17                 int n=in.nextInt();
    18                 long[] p=new long[10010];
    19                 long[] r=new long[10010];
    20                 p[1]=1;
    21                 for(int i=2;i<=n;i++)
    22                 {
    23                     p[i]=p[i-1]*2;
    24                     p[i]=p[i]%mod;
    25                 }
    26                 r[1]=1;
    27                 r[2]=6;
    28                 for(int i=3;i<=n;i++)
    29                 {
    30                     r[i]=2*r[i-1]+p[i]+4*r[i-2];
    31                     r[i]=r[i]%mod;
    32                 }
    33                 long ans=4*r[n];
    34                 for(int i=2;i<=n;i++)
    35                 {
    36                     ans=ans+((8*p[n-i]*r[i-1])%mod+(8*r[n-i]*p[i-1])%mod)%mod;
    37                     ans=ans%mod;
    38                 }
    39                 System.out.println(n==1?2:ans);
    40             }
    41         }
    42     }
    43 
    44 }
  • 相关阅读:
    8051单片机指令和寻址方式
    C/C++的关系
    go JSON 读写到文件
    Oracle 对未提交事务的查询
    win8 iis 安装
    Silverlight 项目 对话框
    VisualSVN错误 Cannot query proxy blanket解决办法
    silverlight浏览器自适应问题
    windows server2003 多用户登陆问题解决办法
    silverlight 缺少对象错误
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/7392240.html
Copyright © 2011-2022 走看看