这题因为只有三个字符,并且数据较小,很容易想到用暴力方法求解。对于每一个位置,分别插入A/B/C三种字符,然后计算分数,取最大值。
分数的计算有两种思路,对于每次遍历,计算消除的分数后,一种是把不能消除的字符用一个新的字符串记录,另一种是把要消除的用特殊符号标记,最后在原字符串的基础上进行删除。前者写起来比较容易,后者相对麻烦。我写的是后者(逃
#include <bits/stdc++.h> using namespace std; string s,ts; int ans,tmp; int cal(string ss) { int cnt=0,flag=1; while(flag) { flag=0; int l=ss.length(); //cout<<ss<<endl; for(int i=0;i<l;) { if(ss[i]==ss[i+1]) { flag=1; int j; for(j=i+1;j<l;j++) { if(ss[j]!=ss[j+1]) break; } cnt+=j-i+1; for(int k=i;k<=j;k++) ss[k]='*'; i=j+1; } else i++; } //cout<<ss<<endl; string::iterator it; for(it=ss.begin();it!=ss.end();it++) { if(*it=='*') { ss.erase(it); it--; } } //cout<<ss<<endl; } return cnt; } int main() { int T; cin>>T; while(T--) { cin>>s; int l=s.length(); ans=0; for(int i=0;i<=l;i++) { ts=s; ts.insert(i,"A"); tmp=cal(ts); ans=max(ans,tmp); ts=s; ts.insert(i,"B"); tmp=cal(ts); ans=max(ans,tmp); ts=s; ts.insert(i,"C"); tmp=cal(ts); ans=max(ans,tmp); } cout<<ans<<endl; } }View Code
标签:分数,字符,int,flag,1039,ans,消除 来源: https://www.cnblogs.com/FTA-Macro/p/11301706.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。