zoukankan      html  css  js  c++  java
  • LA 3516

    Exploring Pyramids

    Archaeologists have discovered a new set of hidden caves in one of the Egyptian pyramids. The 
    decryption of ancient hieroglyphs on the walls nearby showed that the caves structure is as follows. 
    There are n caves in a pyramid, connected by narrow passages, one of the caves is connected by a 
    passage to the outer world. The system of the passages is organized in such a way, that there is exactly 
    one way to get from outside to each cave along passages. All caves are located in the basement of the 
    pyramid, so we can consider them being located in the same plane. Passages do not intersect. Each 
    cave has its walls colored in one of several various colors. 
    The scientists have decided to create a more detailed description of the caves, so they decided to 
    use an exploring robot. The robot they are planning to use has two types of memory — the output 
    tape, which is used for writing down the description of the caves, and the operating memory organized 
    as a stack. 
    The robot first enters the cave connected to the outer world along the passage. When it travels 
    along any passage for the first time, it puts its description on the top of its stack. When the robot 
    enters any cave, it prints the color of its walls to its output tape. After that it chooses the leftmost 
    passage among those that it has not yet travelled and goes along it. If there is no such passage, the 
    robot takes the passage description from the top of its stack and travels along it in the reverse direction. 
    The robot’s task is over when it returns to the outside of the pyramid. It is easy to see that during 
    its trip the robot visits each cave at least once and travels along each passage exactly once in each 
    direction. 
    The scientists have sent the robot to its mission. After it returned they started to study the output 
    tape. What a great disappointment they have had after they have understood that the output tape 
    does not describe the cave system uniquely. Now they have a new problem — they want to know how 
    many different cave systems could have produced the output tape they have. Help them to find that 
    out. 
    Since the requested number can be quite large, you should output it modulo 1 000 000 000. Please 
    note, that the absolute locations of the caves are not important, but their relative locations are important, 
    so the caves (c) and (d) on the picture below are considered different. 

    Input

    The input file contains the output tape that the archaeologists have. The output tape is the sequence of 
    colors of caves in order the robot visited them. The colors are denoted by capital letters of the English 
    alphabet. The length of the tape does not exceed 300 characters.

    Output

    Output one integer number — the number of different cave systems (modulo 1 000 000 000) that could 
    produce the output tape.

    Sample Input

    ABABABA 
    AB

    Sample Output


    0

    题意:

           给出一颗多叉树,每个结点的任意两个子结点都有左右之分。从根结点开始,每次尽量往左走,走不通了就回溯,把途中遇到的字母顺次记录下来,就可以得到一个序列。给定一个序列,问有多少棵多叉树与之对应。

    分析:

           设输入的序列是S,d(i,j)表示子序列Si,Si+1,…,Sj对应的树的个数,那么边界条件就是d(i,i) = 0,且Si不等于Sj时d(i,j) = 0(起点与终点应是同一点)。这道题我们只用记忆化搜索的方式予以实现。属于区间dp。

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 const int maxn = 300;
     5 const int MOD = 1e9;
     6 typedef long long LL;
     7 char S[maxn + 1];
     8 int d[maxn + 1][maxn + 1];
     9 int dp(int i,int j){
    10     if(i == j) return 1;
    11     if(S[i] != S[j]) return 0;
    12     int &ans = d[i][j];
    13     if(ans >= 0) return ans;
    14     ans = 0;
    15     for(int k = i + 2 ; k <= j ; k++)
    16         if(S[i] == S[k])
    17             ans = (ans + (LL)dp(i + 1,k - 1) * (LL)dp(k,j)) % MOD;
    18     return ans;
    19 }
    20 int main(){
    21     while (scanf("%s",S) == 1){
    22         memset(d,-1,sizeof(d));
    23         printf("%d
    ",dp(0,strlen(S) - 1));
    24     }
    25     return 0;
    26 }
    View Code
  • 相关阅读:
    【bzoj1196】[HNOI2006]公路修建问题
    【bzoj1082】栅栏[SCOI2005]
    【bzoj1012】[JSOI2008]最大数maxnumber
    【bzoj2330】 [SCOI2011]糖果
    【bzoj1008】[HNOI2008]越狱
    【bzoj1002】 [FJOI2007]轮状病毒DP
    【bzoj1001】[BeiJing2006]狼抓兔子
    C++-POJ2234-Matches Game[Nim][SG函数]
    C++-POJ1067-取石子游戏
    lodash常用
  • 原文地址:https://www.cnblogs.com/cyb123456/p/5805000.html
Copyright © 2011-2022 走看看