1. 程式人生 > 其它 >AtCoder Beginner Contest 252 G - Pre-Order

AtCoder Beginner Contest 252 G - Pre-Order

首先如果這是一棵二叉樹,是不是很顯然?只要列舉左右子樹即可,時間複雜度為O(n^3)。可惜題目中不是棵二叉樹,所以我們就把它轉換為二叉樹!按照左兒子右兄弟的方式進行構造,我們發現它的dfs序與原本的樹是相同的!

我寫了記憶化,但其實也可以直接區間

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2000009;
const ll mo=998244353;
int n,a[maxn];
ll dp[1000][1000];
ll dfs(int l,int r)
{
    if (l==r) return
1ll; if (dp[l][r]!=-1) return dp[l][r]; ll ans=0; for (int i=l;i<=r;i++) { if (i==r) ans=(ans+dfs(l+1,r))%mo; else if ((i==l)&&(a[l]<a[l+1])) ans=(ans+dfs(l+1,r))%mo; else if (a[l]<a[i+1])ans=(ans+(dfs(l+1,i)*dfs(i+1,r))%mo)%mo; } dp[l][r]
=ans; //cout<<l<<" "<<r<<" "<<ans<<endl; return ans; } int main() { cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) dp[i][j]=-1; cout<<dfs(2,n)<<endl; return
0; }