AtCoder Beginner Contest 252 G - Pre-Order
阿新 • • 發佈:2022-05-22
首先如果這是一棵二叉樹,是不是很顯然?只要列舉左右子樹即可,時間複雜度為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) return1ll; 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; return0; }