专栏文章
题解:P13586 [NWRRC 2023] First Solved, Last Coded
P13586题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioe3kxv
- 此快照首次捕获于
- 2025/12/02 17:42 3 个月前
- 此快照最后确认于
- 2025/12/02 17:42 3 个月前
题意
给定入栈序列 ,询问是否能用一个栈达成出栈序列 ,如果可行则构造方案,序列中元素可重复,。
思路
设 表示从序列 中下标为 、序列 中下标为 的元素为左端点,长度均为 的区间能否使用栈完成要求。
枚举 在序列 的区间 所匹配的位置,有如下递推公式:
直接 dp 并根据转移过程构造方案即可,时间复杂度 。
CPP#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[105],b[105],f[105][105][105];
int dp(int l1,int l2,int len){
if(len<=0)return 1;
if(f[l1][l2][len]!=-1)return f[l1][l2][len];
int r1=l1+len-1,r2=l2+len-1;
if(r1>n||r2>n)return f[l1][l2][len]=0;
if(len==1)return f[l1][l2][len]=a[l1]==b[l2]?1:0;
int ans=0;
for(int i=l2;i<=r2;i++){
int lans=(a[l1]==b[i]?1:0)&dp(l1+1,l2,i-l2)&dp(l1+i-l2+1,i+1,r2-i);
ans|=lans;
}
return f[l1][l2][len]=ans;
}
void print(int l1,int l2,int len){
if(len<=0)return;
if(len==1){
cout<<'S'<<'C';
return;
}
int r1=l1+len-1,r2=l2+len-1;
for(int i=l2;i<=r2;i++){
int lans=(a[l1]==b[i]?1:0)&dp(l1+1,l2,i-l2)&dp(l1+i-l2+1,i+1,r2-i);
if(lans==1){
cout<<'S';
print(l1+1,l2,i-l2);
cout<<'C';
print(l1+i-l2+1,i+1,r2-i);
return;
}
}
}
void work(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)f[i][j][k]=-1;
int ans=dp(1,1,n);
if(ans==1){
cout<<"YES\n";
print(1,1,n);
}else cout<<"NO";
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T=1;
while(T--)work();
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...