- 给出一个遍历树的程序的输出的遍历顺序,问可能的树的形态有多少种。
- 枚举所有树合并的方案,根据乘法原理得到最终方案。也就是枚举以l为根的树的第一个孩子的子树的规模。
- 然后乘上后面的一个子树或者森林的形态数,加在当前选定的根的情况。
-
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 555 #define mod 1000000007 ll dp[maxn][maxn]; int b[maxn],n; ll dfs(int l,int r) { ll ans=0; if(l==r)return 1; if(dp[l][r]!=-1)return dp[l][r]; for(int i=l+1; i<=r; i++) { if(i!=r&&b[l+1]>=b[i+1])continue; ans=(ans+dfs(l+1,i)*dfs(i,r)%mod)%mod; } return dp[l][r]=ans; } int main() { memset(dp,-1,sizeof(dp)); scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&b[i]); printf("%lld\n", dfs(1,n)); return 0; }
codeforces 509F F. Progress Monitoring(区间dp)
最新推荐文章于 2020-08-24 22:08:31 发布