CH 5302 金字塔



$ solution: $

很神奇的一道题目,当时看到还以为是一道字符串求回文子串的题目。但是数据范围很小,而且只知道回文串也不好做。但是我们观察可得,如果是深度搜索便利,那么它经过的子树应该是从左到右排列有序的,于是我们想到线性DP。然后我们发现似乎可以单独求某一段的便遍历方式然后合并,这就是区间DP的标志啊!于是我们考虑设 $ F[l][r] $ 表示从第 $ l $ 到第 $ r $ 个字符可以有的子树遍历方案(注意既然是子树遍历方案,那么 $ l $ 字符和 $ r $ 的字符一致,因为它们都表示是这颗子树的根节点 )。但是这样我们的转移需要保证不重不漏的计算左右情况。

这里很重要:(可能代码很好码,但原理我们不能模糊带过!)根据经验我们要找一个基准点来保证不重不漏,而常规套路就是枚举一个分段 $ k $ (注意我们的这个 $ k $ 的字符要和两端字符一样!因为当前子树需要根!)使得 $ [l,k] $ 为第一颗子树(注意这颗子树此时还连着根)而 $ [k,r] $ 这一段是另外的随便什么遍历方式,于是我们需要保证 $ [l,k] $ 为一颗子树(因为它现在还连着根),不能让它划分为连着根的多颗子树的形式,于是我们强制连边使 $ [l+1,k-1] $ 为一颗真正的不连边的子树,而强制连的边就是 $ e(l,l+1) $ 或者说 $ e(r,r-1) $ 。于是我们需要保证 $ l+1 $ 的字符和 $ k-1 $ 的字符一致(因为它们都表示是这颗子树的根节点)。然后我们就可转移了!

$ F[l][r]=\sum^{k\leq r}_{k=l+2} {f[l+1][k-1]\times f[k][r] }_{条件:s[l+1]s[k-1],s[k]s[r]} $



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int using namespace std; const int mod=1e9; int n;
int f[305][305];
string s; inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
} inline int solve(int l,int r){
if(l==r)return 1;
if(f[l][r]>=0)return f[l][r];
else f[l][r]=0;
for(rg k=l+2;k<=r;++k)
if(s[l+1]==s[k-1]&&s[k]==s[r])
f[l][r]=(f[l][r]+(ll)solve(l+1,k-1)*solve(k,r)%mod)%mod;
return f[l][r];
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>s; n=s.size(); s=' '+s;
memset(f,-1,sizeof(f));
printf("%d\n",solve(1,n));
return 0;
}

CH 5302 金字塔(区间DP)的更多相关文章

  1. 『金字塔 区间dp』

    金字塔 Description 虽然探索金字塔是极其老套的剧情,但是这一队 探险家还是到了某金字塔脚下.经过多年的研究,科 学家对这座金字塔的内部结构已经有所了解.首先, 金字塔由若干房间组成,房间之 ...

  2. $CH5302$ 金字塔 区间$DP$/计数类$DP$

    CH Sol f[l][r]表示l到r这段区间对应的金字塔结构种数 发现是f[l][r]是可以由比它小的区间推出来的 比如已知f[l+1][k],f[k+1][r],不难想到f[l][r]+=f[l+ ...

  3. 【CH5302】金字塔 区间DP

    题目大意:给定一棵树,树上点有标记,给定一棵树的\(dfs\)序标记序列,求有多少种可能的子树形态.(子树之间有序) 这是一道区间计数类DP,涉及到树的\(dfs\)序. 这道题区间的划分点 \(k\ ...

  4. CH5302 金字塔【区间DP】

    5302 金字塔 0x50「动态规划」例题 描述 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下.经过多年的研究,科学家对这座金字塔的内部结构已经有所了解.首先,金字塔由若干房间 ...

  5. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  6. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  7. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  8. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

  9. cdoj 1131 男神的礼物 区间dp

    男神的礼物 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1131 Descr ...

随机推荐

  1. VIJOS 1889 天真的因数分解 ——莫比乌斯函数

    同理BZOJ2440 二分答案,不过这次变成了统计含有平方因子的个数 #include <cmath> #include <cstdio> #include <cstri ...

  2. POJ 1067: Wythoff Game【博弈】

    经典的威佐夫博奕把黄金分割常数乘以k(k=m-n)即为奇异点,此时奇异点是用小数据观察出来的,具体的数学证明,观察到黄金分割常数是无理数,再加上高斯函数[kφ]的形势将自然数分割成两个等价类很容易想到 ...

  3. BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】

    题目 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...

  4. [HNOI2002]彩票 (搜索+剪枝)

    题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...

  5. 【DFS序+树状数组】BNUOJ 52733 Random Numbers

    http://acm.bnu.edu.cn/v3/problem_show.php?pid=52733 [题意] 给定一棵树,这棵树每个点都有一个点权,标号从0开始,0是根结点 修改操作: SEED ...

  6. You need to install the perl-doc package to use this program

    You need to install the perl-doc package to use this program 解决方案:apt-get install perl-doc

  7. 文艺平衡树(bzoj 3223)

    Description   您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2  ...

  8. R语言入门视频笔记--10--数据挖掘

    这里来挖掘超市购物车数据. 名词: 1.挖掘数据集:购物篮数据 2.挖掘目标:关联规则 3.关联规则:牛奶=>鸡蛋[支持度=2%,置信度=60%] 4.指出度:分析中的全部事务的2%同时购买了牛 ...

  9. 三种Model模式

    目前项目中可能出现的三种Model模式,对于我们现在开发的一个项目,我觉得使用DDD的思想来设计模型比较清晰,使用DDD的思想把模型model分成了如下三种:ViewModel,它与页面相关,Doma ...

  10. Oracle 12c PDB和CDB全局用户权限问题

    Oracle12c版本中引入了新的CDB和PDB 默认登陆CDB后创建的用户为全局用户必须以c##开头 如果要访问CDB中的表,可以用GRANT命令赋权 但是上面的赋权并不会再PDB中生效 如果要这个 ...