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;
}
posted @ 2022-04-18 09:36  wzx_believer  阅读(84)  评论(0编辑  收藏  举报