UVALive - 3516 Exploring Pyramids 【多叉树遍历】

题目传送门

题目描述:给出一棵多叉树,每个节点的任意两个子节点都有左右之分。从根节点开始,每次尽量往左走,走不通了就回溯,把遇到的字母顺次记录下来,可以得到一个序列。如下图所示的5个图的序列均为ABABABA

给定一个序列,问有多少棵树与之对应。

输入:输入包含多组数据,每组数据仅一行,即由大写字母组成的访问序列。序列非空且长度不超过300。

输出:对于每组数据,输出满足条件的多叉树的数目除以10^9的余数。

解题思路:设输入序列为s,d[i][j]为子序列s[i],s[i+1],......,s[j]对应的树的个数,则边界条件是d[i][i]=1,且s[i]不等于s[j]时d[i][j]=0(因为起点和终点应是同一点)。在其他情况下,设第一个分支在s[k]时回到树根(必须有s[i]=s[k]),则这个分支对应的序列是s[i+1],......,s[k-1],方案数为d[i+1][k-1];其他分支对应的序列为s[k],.....,s[j],方案数为d[k][j]。由此可得非边界情况时递推关系为:d[i][j]=sum{d[i+1][k-1]*d[k][j] | i+2<=k<=j,s[i]=s[k]=s[j]}。

AC代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define io ios::sync_with_stdio(0),cin.tie(0)
#define ms(arr) memset(arr,0,sizeof(arr))
#define inf 0x3f3f3f
typedef long long ll;
const int mod=1000000000;
const int maxn=310;
char s[maxn];
int dp[maxn][maxn];
int DP(int i,int j)
{
    if(i==j)
        return 1;
    if(s[i]!=s[j])
        return 0;
    int& ans=dp[i][j];//&为引用符号,改变ans的同时改变d[i][j]
    if(ans>=0)
        return ans;
    ans=0;
    for(int k=i+2;k<=j;k++)
    {
        if(s[i]==s[k])
            ans=(ans+(ll)DP(i+1,k-1)*(ll)DP(k,j))%mod;
    }
    return ans;
}
int main()
{
    while(scanf("%s",s)==1)
    {
        memset(dp,-1,sizeof(dp));
        printf("%d\n",DP(0,strlen(s)-1));
    }
    return 0;
}

 

 

### 介绍 快速搜索随机树(RRT - Rapidly-Exploring Random Trees)是一种常见的用于机器人路径(运动)规划的方法,本质上是一种随机生成的数据结构——树。这种思想自从LaValle提出以后得到了极大的发展,至今仍有改进的RRT不断被提出[^1]。 ### 原理 RRT算法的效果是随机采样点会“拉着”树向外生长,从而更快、更有效地探索空间。其随机探索有特定策略,若从树中随机取一个点然后向着随机的方向生长,树可能无法很好地探索空间。在规划路径时,已确定规划的起始点,树需朝着目标点生长,但由于存在障碍物,若让树型一味朝着目标点延伸,可能会因“撞墙”而失败。所以采取随机采样方法,在每次选择生长方向时,有一定的概率会向着目标点延伸,也有一定的概率会随机在地图内选择一个方向延伸一段距离,例如使用`rand()`函数在`[0,1]`区间内随机生成一个数,若小于0.5,则在图的范围内随机采样一个点,否则用目标点作为采样点[^2][^3]。 ### 应用 RRT主要应用于机器人路径规划领域,帮助机器人在复杂环境中找到从起始点到目标点的可行路径,能有效处理存在障碍物的环境。 ### 代码实现 以下是一个简单的Python代码示例,展示了RRT算法的核心逻辑: ```python import numpy as np class RRT: def __init__(self, start, goal, img_binary): self.start = start self.goal = goal self.img_binary = img_binary self.tree = [start] def planning(self): while True: # 随机采样 if np.random.rand() < 0.5: sample = np.mat(np.random.randint(0, self.img_binary.shape[0] - 1, (1, 2))) else: sample = np.mat(self.goal) # 找到树中距离采样点最近的点 nearest_node = min(self.tree, key=lambda node: np.linalg.norm(np.array(node) - np.array(sample))) # 从最近点向采样点生长一定距离 new_node = self.extend(nearest_node, sample) # 检查新节点是否有效 if self.is_valid(new_node): self.tree.append(new_node) # 检查是否到达目标点 if np.linalg.norm(np.array(new_node) - np.array(self.goal)) < 1: break return self.tree def extend(self, nearest_node, sample): distance = 10 # 生长距离 direction = (np.array(sample) - np.array(nearest_node)) / np.linalg.norm(np.array(sample) - np.array(nearest_node)) new_node = np.array(nearest_node) + distance * direction return new_node def is_valid(self, node): # 简单示例,检查节点是否在地图范围内且不在障碍物上 x, y = int(node[0][0]), int(node[0][1]) if 0 <= x < self.img_binary.shape[0] and 0 <= y < self.img_binary.shape[1]: return self.img_binary[x, y] == 0 return False # 示例使用 start = [0, 0] goal = [100, 100] img_binary = np.zeros((200, 200)) # 简单示例地图 rrt = RRT(start, goal, img_binary) path = rrt.planning() print(path) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值