首页 > 其他分享 >Luogu P10956 金字塔

Luogu P10956 金字塔

时间:2024-09-24 17:03:44浏览次数:5  
标签:子树 return int Luogu 棵子 P10956 str 金字塔 dp

Solution

考虑区间 dp。很容易想到定义 \(dp_{l,r}\) 表示区间 \([l,r]\) 对应的满足条件的子树的方案数。

一般区间 dp 的套路无非就是枚举一个断点 \(k\),使得这个大状态由两个小状态转移过来,我们现在需要考虑的就是如何划分每一个状态。

状态对应的子树也有若干个子树。不妨只考虑第一棵子树是什么样的,这样我们将整个状态划分成了第一棵子树和其他子树。所以考虑递归地把每一个 \(dp_{l,r}\) 计算。具体地,每次依然枚举一个断点 \(k\),分割第一棵子树和其他子树,再分别递归计算第一棵子树和其他子树的答案。

下面假设每一个 \(dp_{l,r}\) 已经算出,那么:

\[dp_{l,r}=\sum^{r}_{k=l+2}dp_{l+1,k-1} \times dp_{k,r} \]

Code

使用的是记忆化搜索。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9;
string str;
int n,dp[305][305];
int dfs(int l,int r){
	if(l>r) return 0;
	if(l==r) return 1;
	if(str[l]!=str[r]) return 0;
	if(dp[l][r]!=-1) return dp[l][r];
	dp[l][r] = 0;
	for(int i=l+2;i<=r;i++){
		if(str[l]==str[i]) dp[l][r]=(dp[l][r]+dfs(l+1,i-1)*dfs(i,r))%mod;
	}
	return dp[l][r];
}
signed main(){
	cin>>str;
	n=str.size();
	str=" "+str;
	for(int i=1;i<=n;i++){
	    for(int j=i;j<=n;j++){
	        dp[i][j]=-1;
	    }
	}
	cout<<dfs(1,n)<<endl;
	return 0;
}

标签:子树,return,int,Luogu,棵子,P10956,str,金字塔,dp
From: https://www.cnblogs.com/HAM-qwq/p/18429563

相关文章

  • ScanFormer:逐层抵达目标,基于特征金字塔的指代表达理解框架 | CVPR'24
    指代表达理解(REC)旨在在图像中定位由自由形式自然语言描述指定的目标对象。尽管最先进的方法取得了令人印象深刻的性能,但它们对图像进行了密集感知,包含与语言查询无关的多余视觉区域,导致额外的计算开销。这启发论文探讨一个问题:能否消除与语言无关的多余视觉区域,以提高模型的效率?......
  • Luogu P6680
    题目描述给定一张\(N\)个点,\(M\)条边的无向简单图。如果存在\(1\lea<b<c\leN\)满足存在边\((a,b),(a,c)\),并且不存在\((b,c)\),则加入边\((b,c)\)。求最后的边数。思路首先我们可以把边看做从小的连向大的。通过观察可以发现只有在这种情况下才会建边:这里红色的......
  • luogu-P10596题解
    简要题意一个有\(N\)个元素的集合有\(2N\)个不同子集(包含空集),现在要在这\(2N\)个集合中取出若干集合(至少一个),使得它们的交集的元素个数为\(K\),求取法的方案数,答案模\(10^9+7\)。数据范围:\(1\leK\leN\le10^6\)。题解我们设\(f(i)\)表示选出子集大小恰好为\(i\)的......
  • Luogu P10812
    题目描述给定一根\(1\)到\(N\)的数轴。一开始有一个棋子在\(N\)。每次棋子\(x\)可以跳到\(x-1,x+1\)或\(x\)的因子处(不能超出\(1\)到\(N\))。每个点只能到达一次。求棋子到达\(1\)的方案数。思路由于求倍数比因子简单,所以把问题变成从\(1\)到\(N\),每次跳倍......
  • opencv学习:图像下采样和上采样及拉普拉斯金字塔
    图像下采样和上采样OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理功能,包括图像的上采样和下采样。下采样(Downsampling)下采样是减少图像分辨率的过程,通常用于图像压缩、图像分析等场景。在OpenCV中,下采样可以通过......
  • Luogu P10179 水影若深蓝 题解 [ 绿 ] [ 并查集 ] [ 构造 ]
    水影若深蓝:挺好的一道并查集构造题。观察不难发现“距离为\(2\)”这个条件我们可以通过黑白染色实现,我们把他们的中转点染成与他们相反的颜色,把这两个距离为\(2\)的点染成相同颜色。这个染色问题就很并查集。于是我们用并查集维护相同的种类。显然,当图上只有一个连通块的......
  • 机器学习:opencv--图像金字塔
    目录一、图像金字塔1.图像金字塔是什么?2.有哪些常见类型?3.金字塔的构建过程4.图像金字塔的作用二、图像金字塔中的操作1.向下采样2.向上采样3.注意--无法复原三、代码实现1.高斯金字塔向下采样2.高斯金字塔向上采样3.无法复原4.拉普拉斯金字塔一、图像金字塔......
  • 爆改YOLOv8|利用BiFPN双向特征金字塔改进yolov8
    1,本文介绍BiFPN(BidirectionalFeaturePyramidNetwork)是一种增强特征金字塔网络(FPN)的方法,旨在改善多尺度特征融合。BiFPN的主要创新点包括:双向特征融合:与传统FPN仅在自下而上的方向进行特征融合不同,BiFPN引入了双向融合机制。它不仅从低层特征向高层传递信息,还从高层特征向......
  • 《深度学习》OpenCV 高阶 图像金字塔 用法解析及案例实现
    目录一、图像金字塔1、什么是图像金字塔2、图像金字塔作用    1)金字塔尺度间的图像信息补充    2)目标检测与识别    3)图像融合与拼接    4)图像增强与去噪    5)图像压缩与编码二、用法解析1、向下采样        1)概念......
  • luogu2516题解
    随机说话第一次交的时候写的版本是这个。下面在sum的计算上少了个else,遂出错。以后写的时候还是尽量简单点,主要是调试的时候好调。题目分析题目里面的公共子序列就是可以不连续可以为空的在字符串里出现顺序相同的子串。对于一个公共子序列,在找到最后一个公共的字符的时......