zoukankan      html  css  js  c++  java
  • 【CH5302】金字塔 区间DP

    题目大意:给定一棵树,树上点有标记,给定一棵树的(dfs)序标记序列,求有多少种可能的子树形态。(子树之间有序)

    这是一道区间计数类DP,涉及到树的(dfs)序。

    这道题区间的划分点 (k) 的意义是:对于区间在[ l+1 , k-1 ]的序列,作为这棵树的第一棵子树。因为子树之间是有序的,所以第一棵树的形态的不同就意味着整棵树的形态的不同。另外,能决策的前提是子序列的两个端点值要相等。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int mod=1e9;
    const int maxn=301;
    
    int dp[maxn][maxn],n;
    char s[maxn];
    
    void read_and_parse(){
    	scanf("%s",s+1);
    	n=strlen(s+1);
    
    	for(int i=1;i<=n;i++)dp[i][i]=1;
    }
    
    void solve(){
    	for(int len=2;len<=n;len++){
    		for(int l=1;l<=n-len+1;l++){
    			int r=l+len-1;
    			if(s[l]==s[r]){
    				for(int k=l+2;k<=r;k++)if(s[k]==s[l])
    					dp[l][r]=(dp[l][r]+(long long)dp[l+1][k-1]*dp[k][r])%mod;
    			}
    		}
    	}
    	printf("%d
    ",dp[1][n]);
    }
    
    int main(){
    	read_and_parse();
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    bit、byte、word的区别
    JavaScript
    品牌的意义
    Java开发
    Java:关于implements Serializable的警告问题
    文件路径:/和的区别
    Iterator
    parameter和argument的区别
    Java中private、protected、public和default的区别
    Java异常
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/9837843.html
Copyright © 2011-2022 走看看