[Gym 101334E]Exploring Pyramids(区间dp)
2024-09-08 08:34:29
题意:给定一个先序遍历序列,问符合条件的树的种类数
解题关键:枚举分割点进行dp,若符合条件一定为回文序列,可分治做,采用记忆化搜索的方法。
转移方程:$dp[i][j] = \sum {dp[i + 1][k - 1]*dp[k][j]} $ 令$dp[i][j]$表示i到j里数量
1、记忆化搜索
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9;
ll dp[][];
char a[]; ll dfs(int l,int r){
if(dp[l][r]!=-)return dp[l][r];
if(l==r) return dp[l][r]=;
if(a[l]!=a[r]) return ;
dp[l][r]=;
for(int i=l+;i<=r;i+=){
if(a[i]==a[l]){
dp[l][r]+=dfs(l+,i-)*dfs(i,r);//一定注意dp的顺序
dp[l][r]%=mod;
}
}
return dp[l][r];
} int main(){
freopen("exploring.in", "r", stdin);
freopen("exploring.out", "w", stdout);
while(~scanf("%s", a)){
memset(dp,-,sizeof dp);
int len=strlen(a);
printf("%lld\n", dfs(,len-)%mod);
}
return ;
}
2、区间dp
#include<bits/stdc++.h>
#define mod 1000000000
using namespace std;
typedef long long ll;
string a;
ll dp[][],len;
int main(){
freopen("exploring.in", "r", stdin);
freopen("exploring.out", "w", stdout);
while(cin>>a){
memset(dp,,sizeof dp);
len=a.size();
if(len%==){
cout<<<<endl;
continue;
}
for(int i=;i<len;i++) dp[i][i]=;
for(int i=;i<len;i+=){
for(int l=,r;l+i<len;l++){
r=l+i;
if(a[l]==a[r]){
for(int k=l+;k<=r;k++)
if(a[k]==a[l])
dp[l][r]=(dp[l][r]+dp[l+][k-]*dp[k][r])%mod;
}
}
}
cout<<dp[][len-]<<endl;
}
return ;
}
最新文章
- [LeetCode] Ransom Note 赎金条
- DataGrid排序
- 08day2
- setuid函数解析
- An internal error occurred during: ";Launching New_configuration";
- Entity Framework Core 软删除与查询过滤器
- 用DataRelation给多个DataTable建立关系并显示到TreeView
- SSM-Spring-04:Spring的DI的构造注入,P命名注入,和集合注入
- 该用Python还是SQL?4个案例教你节省时间
- PMP备考资料和备考经验分享(基于PMP第六版)
- 数据结构—头插法逆转单链表——空间复杂度为O(1)
- UML顺序图知识点介绍(Sequence Diagram)
- 我们如何用Go来处理每分钟100万复杂请求的场景
- 关于jQuery.ajax()的jsonp碰上post详解
- 《Gradle权威指南》--Android Gradle NDK支持
- Could not open JDBC Connection for transaction
- 如何用Client OM获取页面上一个Content web part的内容
- 默认的Sublime 3中没有Package Control
- 如何修改jenkins的启动用户?
- shell-网上lnmp一键安装讲解