主页
搜索
最近更新
数据统计
申请密钥
系统公告
1
/
1
请查看完所有公告
T3
最后更新于 2025-07-31 11:47:21
作者
wccnm
分类
个人记录
复制 Markdown
查看原文
删除文章
更新内容
```cpp #include<bits/stdc++.h> using namespace std; const int N=205; int p[N]; long long dp[N][N]; int f[N],mn[N]; int MOD=1e9+7; int oo=1e9; long long C[N][N]; int main(){ freopen("c.in","r",stdin); freopen("c.out","w",stdout); int T,n; cin>>T; while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&p[i]); p[i]++; } C[0][0]=1; for(int i=1;i<=n;i++){ C[i][0]=1; for(int j=1;j<=n;j++){ C[i][j]=C[i-1][j-1]+C[i-1][j]; C[i][j]%=MOD; } } for(int i=n;i>=1;i--){ dp[i][i]=1; for(int j=i+1;j<=n;j++){ int cnt=0; dp[i][j]=0; // cout<<i<<' '<<j<<endl; for(int l=1;l<=n;l++){ if(i<=p[l]&&p[l]<=j){ f[++cnt]=p[l]; // cout<<f[cnt]<<' '; } } mn[cnt+1]=oo; for(int l=cnt;l>=1;l--){ mn[l]=min(mn[l+1],f[l]); } int mx=0; for(int l=1;l<cnt;l++){ if(mx<=i+l-1&&mn[l+2]>i+l-1&&f[l]>i+l-1&&f[l+1]<=i+l-1){ dp[i][j]+=((C[j-i-1][l-1]*dp[i][i+l-1])%MOD*dp[i+l][j])%MOD; dp[i][j]%=MOD; } mx=max(mx,f[l]); } // cout<<dp[i][j]<<' '; // cout<<endl; } } cout<<dp[1][n]<<endl; } } ```
正在渲染内容...
点赞
0
收藏
0