蓝桥杯【算法赛】2.大闹蟠桃园 题型:简单dp

53 阅读1分钟

2.大闹蟠桃园【算法赛】 - 蓝桥云课 (lanqiao.cn)

预处理一个dp数组

其中dp[i]表示第i条道路摘得的蟠桃的数量

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int dp[2*N];
signed main()
{
	int n;cin>>n;
	string s;cin>>s;
	
	//初始化 
	if(s[0]=='Q') dp[0] =1;
	else dp[0]=0;
	 
	//预处理 
	for(int i=1;i<2*n;i++) //破环成链
	{
	  int idx=i%n;  //比如第n+1个位置实际上就是第一个位置 
	  if(s[idx]=='Q') dp[i]=dp[i-1]+1;  //如果当前道路没有天兵把守,摘得的蟠桃数量+1
	  else dp[i]=0;   //否则的话所有的蟠桃被没收	
	} 
	
	int sum=0;
	//计算每条道路最大无天兵把守长度
	//并累加到sum(因为有多个分身) 
	for(int i=0;i<n;i++)
	{
	 sum+=max(dp[i],dp[n+i]);	
	} 
	cout<<sum<<endl; 
	return  0;
}

image.png