Officer Anany Collecting String Subsequences(ECPC2019)
很简单的一道dp 比赛的时候因为初始化的问题耗费了好多时间
dp[i]表示以i为结尾的连续字母的跨度
dp[i]=i-pre+dp[pre] 其中pre为i位置字母的前一个字母
最后答案就是min{dp['Z']}
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=800;
int T;
int dp[maxn];
int wz[30];
string s;
void solve(){
int n;
cin>>n;
cin>>s;
for(int i=0;i<maxn;i++)dp[i]=1e9;
memset(wz,-1,sizeof(wz));
for(int i=0;i<n;i++){
if(s[i]=='A'){
wz[0]=i;
dp[i]=1;
}else {
int pre=wz[s[i]-'A'-1];
if(pre!=-1)
if(dp[pre]!=1e9){
dp[i]=i-pre+dp[pre];
wz[s[i]-'A']=i;
}
}
}
int ans=1e9;
for(int i=0;i<n;i++)
if(s[i]=='Z')
if(dp[i]!=1e9)
ans=min(ans,dp[i]);
cout<<ans<<endl;
}
int main(){
freopen("collectingofficer.in","r",stdin);
cin>>T;
while(T--)solve();
return 0;
}