Exploring Pyramids - POJ 2795 dp

本文介绍了一种使用机器人探索埃及金字塔内部隐藏洞穴的方法,并通过分析机器人返回的数据来推算可能存在的不同洞穴结构数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Exploring Pyramids
Time Limit: 6000MS Memory Limit: 65536K
Total Submissions: 2019 Accepted: 925
Case Time Limit: 2000MS

Description

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 left most passage among thosethat 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 doesnot 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, sothe caves (c) and (d) on the picture below are considered different. 

Input

The input 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

Sample Output

5

Hint

Sample input 2 
AB 
Sample output 2 

题意:给出一棵树的遍历方式,问这棵树有多少种可能性。

思路:dp[i][j]表示s[i]和s[j]相同,且以s[i]为根节点的情况有多少种,然后dp[i][j]+=dp[i+1][k-1]*dp[k][j]%MOD,再加上如果s[i+1],s[j-1]相同时以s[i+1]为根节点的情况dp[i+1][j-1]。

AC代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[310][310],MOD=1e9;
char s[310];
int main()
{
    int i,j,k,n,m;
    while(~scanf("%s",s+1))
    {
        n=strlen(s+1);
        memset(dp,0,sizeof(dp));
        s[0]='#';s[n+1]='$';
        for(i=1;i<=n;i++)
           dp[i][i]=1;
        for(m=2;m<n;m++)
           for(i=1;i+m<=n;i++)
           {
               j=i+m;
               if(s[i]!=s[j])
                 continue;
               for(k=i+1;k<j;k++)
                  if(s[i]==s[k])
                    dp[i][j]+=dp[i+1][k-1]*dp[k][j]%MOD;
               dp[i][j]+=dp[i+1][j-1];
               dp[i][j]%=MOD;
           }
        printf("%I64d\n",dp[1][n]);
  }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值