UVaLive ( LA ) 3516 - Exploring Pyramids (DP 递推)
2014-08-16 20:40
567 查看
UVALive - 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 several test cases, and each of them consists of a single line with 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 For each input case, write to the output a single line containing 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 5 0 |
给出一棵多叉树,每个节点的任意两个子节点都有左右之分。从根节点开始,每次尽量往左走,走不动就回溯,把遇到的字母顺序记录下来,得到一个序列。现在给一个序列,问有多少棵树与之对应。
DP[i][j]表示序列i..j对应的树的数量
则 dp[i][j] = sum(dp[i+1][k-1] * dp[k][j])
看大白上的图就非常直观了
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> #include <cstring> #include <string> #include <map> #include <cmath> #include <queue> #include <set> using namespace std; //#define WIN #ifdef WIN typedef __int64 LL; #define iform "%I64d" #define oform "%I64d\n" #define oform1 "%I64d" #else typedef long long LL; #define iform "%lld" #define oform "%lld\n" #define oform1 "%lld" #endif #define S64I(a) scanf(iform, &(a)) #define P64I(a) printf(oform, (a)) #define P64I1(a) printf(oform1, (a)) #define REP(i, n) for(int (i)=0; (i)<n; (i)++) #define REP1(i, n) for(int (i)=1; (i)<=(n); (i)++) #define FOR(i, s, t) for(int (i)=(s); (i)<=(t); (i)++) const int INF = 0x3f3f3f3f; const double eps = 10e-9; const double PI = (4.0*atan(1.0)); const int maxn = 300 + 20; const int MOD = 1000000000; char str[maxn]; int dp[maxn][maxn]; int f(int s, int e) { if(s == e) return 1; if(dp[s][e] != -1) return dp[s][e]; if(str[s] != str[e]) return 0; int & ans = dp[s][e]; ans = 0; for(int i=s+1; i<=e; i++) if(str[e] == str[i]) { ans = (ans + (LL) f(s+1, i-1) * f(i, e)) % MOD; } return ans; } int main() { while(scanf("%s", str) != EOF) { memset(dp, -1, sizeof(dp)); int n = strlen(str); int ans = f(0, n-1); printf("%d\n", ans); } return 0; }
相关文章推荐
- UVaLive/LA 6806 Hari Merdeka(AC自动机,DP)
- UVALive 3907 (LA 3907) Puzzle AC自动机 + 搜索DP 记录路径
- UVALive 3516 Exploring Pyramids——递推
- UVaLive LA 4256 | UVa 1424 - Salesmen(简单DP)
- UVALive - 4256 || LA 4256 Salesmen 商人(DP)
- UVALive - 3882 And Then There Was One (递推[dp])
- uva live 3516 Exploring Pyramids 区间DP
- UVALIVE 3516(DP)
- uvalive3516(DP)
- UVaLive/LA 6801 Sequence(DP)
- LA 3516(ZOJ 2641) Exploring Pyramids(递推 DP)
- 【区间dp】【记忆化搜索】UVALive - 3516 - Exploring Pyramids
- UVALive 5983 MAGRID(二分+dp)
- UVALive 7392 Bundles of Joy【bitset】【类树形DP】【杂题】
- uva1638(递推关系,dp)
- LA 3516 (计数 DP) Exploring Pyramids
- Wooden Signs uvalive gym 区间dp
- UVALive2038(树形dp)
- UVALive 4126 Password Suspects(AC自动机 套 DP)
- uvalive5721 Activation(概率dp)