最优化问题,石头剪刀布。dp
设dp[i][j][k]代表前i轮,换了j次,当前手势是什么,状态下的最优值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+9;
int n,m,a[maxn], dp[maxn][22][4],ans=0;
char c;
int vs[3][3]={0,1,0,0,0,1,1,0,0};
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>c;
if(c=='H')a[i]=0;
else if(c=='P')a[i]=1;
else a[i]=2;
}
for(int j=0;j<=m;j++)
for(int i=1;i<=n;i++)
for(int k=0;k<=2;k++){
int t=vs[a[i]][k];
if(j==0)
dp[i][j][k]=dp[i-1][j][k]+t;
else
dp[i][j][k]=max(dp[i-1][j][k],max(dp[i-1][j-1][(k+1)%3],dp[i-1][j-1][(k+2)%3]))+t;
}
ans=max(dp[n][m][0],max(dp[n][m][1],dp[n][m][2])) ;
cout<<ans;
}