uva live 3516 - Exploring Pyramids

本文涉及的产品
视频直播,500GB 1个月
简介: 点击打开链接 题意:给出一棵多叉树,每个结点的任意两个子节点都有左右之分。从根节点开始,每次尽量往左走,走不通就回溯,把遇到的字母顺序记录下来,可以得到一个序列。

点击打开链接

题意:给出一棵多叉树,每个结点的任意两个子节点都有左右之分。从根节点开始,每次尽量往左走,走不通就回溯,把遇到的字母顺序记录下来,可以得到一个序列。给定一个序列,问有几种满足的多叉树。

思路:

1 设输入的序列为S,dp[i][j]为子序列Si,Si+1...Sj对应的树的个数,则边界条件是dp[i][i] = 1,且Si不等于Sj时dp[i][j] = 0。

2 这样在非边界情况下,Si = Sj递推的关系为dp[i][j] = sum{dp[i+1][k-1]*dp[k][j]} i+2 <= k <= j。 

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

typedef long long int64;
const int MAXN = 310;
const int MOD = 1e9;

char str[MAXN];
int64 ans[MAXN][MAXN];

int64 solve(int i , int j){
    if(i == j)
		return 1;
	if(str[i] != str[j])
		return 0;
	if(ans[i][j] >= 0) 
		return ans[i][j];
	ans[i][j] = 0;
	for(int k = i+2 ; k <= j ; k++)
		ans[i][j] += (solve(i+1 , k-1)*solve(k , j))%MOD;
    return ans[i][j];	
}

int main(){
    while(scanf("%s" , str) != EOF){
		memset(ans , -1 , sizeof(ans));
		printf("%lld\n" , solve(0 , strlen(str)-1));
	}
	return 0;
}



目录
相关文章
|
人工智能 BI
UVA live 2678 - Subsequence
关于这个题目,有多种的解法,如果枚举起点和终点,时间复杂度为O(n^3),但如果我们用一个数组B把一段数的和存起来,B[i] = sum(a[1].....a[i])。这样就可以把时间复杂度降到O(n^2)。
72 0
uva 10716 - Evil Straw Warts Live
点击打开链接uva 10716 题目意思:  给定一个字符串求出最小需要几步交换(只有相邻才能够交换)能够变成回文串,如果不能构成回文串就输出Ipossbile 解题思路:    1:贪心 2:对于给定的字符串,如果要使得转化...
1017 0
|
API C++ Windows
【Live555】Live555 Windows下使用VS2017编译教程
【Live555】Live555 Windows下使用VS2017编译教程
【Live555】Live555 Windows下使用VS2017编译教程
|
数据建模 C++ Windows
live555开发笔记(一):live555介绍、windows上msvc2017编译和工程模板
live555开发笔记(一):live555介绍、windows上msvc2017编译和工程模板
live555开发笔记(一):live555介绍、windows上msvc2017编译和工程模板