LA 3516 Exploring Pyramids (递推)

2024-03-30 11:58

本文主要是介绍LA 3516 Exploring Pyramids (递推),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LA 3516 Exploring Pyramids

题目大意:

给一棵多叉树,从根节点开始,每次尽量往左走,走不通则回溯,将遇到的字母顺次记录下来,得到一个序列.现在给一个序列,求有多少棵树可以与之对应.

题目分析:

定义状态dp(i,j)表示序列[i,j]可形成的树的种类数。
设序列为S,因为在回溯的过程中也要记录,所以在选择某两个位置i和j时,需保证S[i]=S[j].
转移方程如下

dp(i,j)=dp(i+1,k1)dp(k,j)|S[i]=S[k]=S[j]
边界为 dp(i,i)=1,dp(i,j)=0|S[i]!=S[j]

代码:

//递推
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;typedef long long ll;
const int MOD=1e9;
const int maxn=300+10;char S[maxn];
int d[maxn][maxn];int solve(int len)
{memset(d,0,sizeof(d));for(int i=0;i<len;i++) d[i][i]=1;for(int l=2;l<=len;l++)for(int s=0;s+l-1<len;s++) {int t=s+l-1;if(S[s]!=S[t]) continue;int& ans=d[s][t];for(int k=s+2;k<=t;k++) if(S[s]==S[k])ans=(ans+(ll)d[s+1][k-1]*d[k][t])%MOD;}return d[0][len-1];
}int main()
{while(~scanf("%s",S)) printf("%d\n",solve(strlen(S)));return 0;
}
//递归
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;typedef long long ll;
const int MOD=1e9;
const int maxn=300+10;char S[maxn];
int d[maxn][maxn];int dp(int i,int j)
{if(i==j) return 1;if(S[i]!=S[j]) return 0;int& 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)) {memset(d,-1,sizeof(d));printf("%d\n",dp(0,strlen(S)-1));}return 0;
}

这篇关于LA 3516 Exploring Pyramids (递推)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861428

相关文章

uva 568 Just the Facts(n!打表递推)

题意是求n!的末尾第一个不为0的数字。 不用大数,特别的处理。 代码: #include <stdio.h>const int maxn = 10000 + 1;int f[maxn];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);#endif // LOCALf[0] = 1;for (int i = 1; i <=

HLJUOJ1128 HDU2046(数学递推)

1128: 递推求解专题练习三 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 8   Solved: 6 [ Submit][ Status][ Web Board] Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数。 例如n=3时,为2× 3方格,骨牌的铺放方案有三

La-Z-Boy 标签制作注意事项

在制作标签之前,供应商需要通过EDI向La-Z-Boy发送提前发货通知(ASN)。ASN中的每个明细行将会至少对应一个运输编号(shipment ID),这个信息将会被体现在运输标签上,和标签上的条形码一起,用于La-Z-Boy收货。 供应商必须确保其装箱单以及发票中的信息能够对应上该批次货物的运输标签以及相关运输编号。供应商可以在La-Z-Boy提供的标签文档中,找到La-Z-Boy EDI部

【递推】【DP】-HDU-2064-汉诺塔③

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目描述:从最左边移到最右边柱子的过程中必须经过中间柱子。 解题思路: 进ACM组时候的考试题,当时虐我的题终于被我虐回来了。。一眼看出方程,1A了。。。呵呵。。满足一下我的虚荣心,,,抚慰一下受挫的心灵吧。 AC代码: #include <iostream>using names

【递推】【DP】-HDU-1996-汉诺塔⑥

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 题目描述:问三个柱子上放N个盘子,一共可能有多少种组合?(可以有柱子不放,放的时候依然满足下面盘子比上面盘子大) 解题思路: 对于放N个盘子,ans [ N ] = 3 + 6 * f ( N ) +6 * g ( N ) 这三项依次代表这N个盘子分成一堆,两堆,三堆时有多少种可能。排列

【递推】【DP】-HDU-1995-汉诺塔⑤

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 题目描述:计算汉诺塔中某个盘子的移动次数 解题思路: 想了好久,突然顿悟! 思路如下,所谓递推,即是前者与后者存在直接联系,由前者可以直接推出后者,因此必须有一端是已知的,这题里显然最下面的盘子只被动了一次,这就是开端,然后我们考虑紧挨着的两张盘子的递推关系,发现上面盘子是紧挨着的下面盘

【递推】【DP】-HDU-1207-汉诺塔②

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 题目描述:四柱汉诺塔 解题思路: 开始想了方程 f [ n ] = 2 * f [n - 2] + 3和 f [ n ] = 2 * f [n - 3] + 7。结果都不对,很郁闷,纠结半天之后,上网查攻略去了,啊!我就差一点了,但也是差了最为关键的一步! 正确的方程应该是: f [

蓝桥杯备赛day02:递推

斐波那契数列 #include <bits/stdc++.h>using namespace std;int main(){int n;cin>>n;int dp[n+1];dp[1]=1;dp[2]=1;for(int i = 3;i <= n;i++) dp[i] = dp[i-1]+dp[i-2];cout<<dp[n];return 0;} n = int(input())

Android 解决 No static method in class La/a/a/a; or its super classes

错误堆栈: Process: com.chaozh.iReader, PID: 24217java.lang.NoSuchMethodError: No static method getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; in class La/a/a/a; or its super

递推—杭电2044 一只小蜜蜂...

http://acm.hdu.edu.cn/showproblem.php?pid=2044 一只小蜜蜂... Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 35811    Accepted Submission(s): 1317