今天我们来讲一下一维差分
什么是差分呢?
比如有一个一维数组a,他的前缀和数组是b,那么a数组就是b数组的差分数组
也就是说,一个一维数组就是它的前缀和数组的差分数组
非常好理解是8
来看一下题目(又是非常简单的一维差分题a)
‘P’代表布,‘S’代表剪刀,‘H’表示石头。‘P’能赢‘H’,‘H’能赢‘S’,‘S’能赢‘P’。小愤同学与小千同学玩N轮游戏,给出小愤同学每一轮出的手势,小愤同学第i 轮游戏出的手势是f[i],其中f[i]是‘P’或者‘H’或者‘S’三种手势之一。小千同学比较懒,具体来说,他在整个N轮游戏过程中,最多只改变一次手势。小千同学想知道,在上述条件限制下,他最多能赢多少轮?
输入:第一行,一个整数N。 1 <= N <= 100000。
接下来有N行,第i 行是f[i]。f[i]是‘P’或者‘H’或者‘S’三种手势之一。
输出:一个正整数。
输入样例:
5
P
P
H
P
S
输出样例:
4
【样例解释】
小千出的手势依次是: S、S、S、S、H,能赢4轮。
相信大家不花10秒就能理解啊
给一下简陋的代码
#include<bits/stdc++.h>
using namespace std;
int n,p[100010],h[100010],s[100010],P,H,S,zd1,zd2,zzd;
char a[100010];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
if(a[i]=='P') p[i]=p[i-1]+1;
else p[i]=p[i-1];
if(a[i]=='H') h[i]=h[i-1]+1;
else h[i]=h[i-1];
if(a[i]=='S') s[i]=s[i-1]+1;
else s[i]=s[i-1];
}
for(int i=1;i<=n;i++)
{
zd1=zd2=0,P=p[i],H=h[i],S=s[i];
if(P>zd1) zd1=P;
if(H>zd1) zd1=H;
if(S>zd1) zd1=S;
P=p[n]-p[i],H=h[n]-h[i], S=s[n]-s[i];
if(P>zd2) zd2=P;
if(H>zd2) zd2=H;
if(S>zd2) zd2=S;
if(zd2+zd1>zzd) zzd=zd2+zd1;
}
cout<<zzd;
return 0;
}