题目链接
https://www.luogu.com.cn/problem/P2697
解题思路
前缀和(或者dp,但是我找了好久都没有找到dp的题解,难道大家都不会dp做法吗?我反正不会)
有一个G,前缀和-1;有一个R前缀和+1。
找到距离最远且前缀和相等的两个位置,索引相减就是相差的个数,即最长宝石串。
举例:
G R G G R G
数值: 0 -1 1 -1 -1 1 -1
前缀和:0 -1 0 -1 -2 -1 -2
最远且前缀和相等的是第一个G和最后一个R吧,对应索引之差就是4,即宝石串为RGGR。
AC代码
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; char s[N]; int cnt[N]; int main(){ cin>>s+1; int len=strlen(s+1); cnt[0]=0; for(int i=1;i<=len;i++) if(s[i]=='G') cnt[i]=cnt[i-1]-1; else if(s[i]=='R') cnt[i]=cnt[i-1]+1; int ans=0; for(int i=0;i<=len;i++)//从0开始!!! for(int j=i+1;j<=len;j++) if(cnt[i]==cnt[j]) ans=max(ans,j-i); cout<<ans<<endl; }
最后
要是会了dp做***补题解的。