284. 金字塔(区间DP)

该博客探讨了一种基于区间动态规划的方法来解决字符串构成金字塔的问题。作者通过建立树形结构,强调字符串必须为奇数长度,并且相邻节点颜色相同才能构成有效的金字塔。在动态规划过程中,区间被分割成两部分并递归地计算子树,最后得出能够构成金字塔的字符串组合数量。算法实现中涉及了字符串处理、区间更新和模运算等概念。
摘要由CSDN通过智能技术生成

284. 金字塔
区间DP
将金字塔看成是树形结构,将所有字符串看成是最大的树,树是由多个子树构成
分割字符串,字符串个数必须是奇数才有可能构成完整的树 f [ i ][ j ] 中 a[ i ] == a[ j ]
区间 f[ i ][ j ] 分成两部分 f[ i ][ k ]和 f[ k+1 ][ j-1 ] , k-i+1 必须是奇数
区间 f[ i ][ j ]是由 f[ i ][ k ]和 f[ k+1 ][ j-1 ] 两个子树构成

#include<iostream>
#include<cstring>
#include<algorithm>
typedef long long ll;
const int N=310,MOD=1e9;
ll f[N][N];
char a[N];
int main()
{
	int i,j,k,len,n,m;
	scanf("%s",&a);
	int la=strlen(a);
	for(len=1;len<=la;len+=2)//房间数必须是奇数,并且最小是1 
	{
		for(i=0;i<=la-len;i++)//从0开始,左端点 
		{
			j=i+len-1;//右端点 
			if(len==1) f[i][j]=1;//当树大小为1时,房间数是1 
			else if(a[i]==a[j])//两个房间颜色必须相同才可能构成数 
			{
				for(k=i;k<j;k+=2)//中间分割点距离左端点必须是奇数才能构成树 
				{
					if(a[i]==a[k])//判断左端点和中间分割点颜色相同 
						f[i][j]=(f[i][j]+f[i][k]*f[k+1][j-1])%MOD;
				}
			}
		}
	}
	printf("%lld\n",f[0][la-1]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值