小爱所在的地方盛产三种水果,三种水果的编号分别为 1,2,3。 在第i个月,小爱会得到一份水果,品种为a[i] 。小爱可以将水果出口到南极或北极。 南极与北极的消费者都喜欢不同品种的水果,他们对新进口水果的评价,与最近两次进口的水果品种有关。消费者会把这三份水果组成一个集合: 若集合中有三种不同的品种,则新水果可以获得 3 分。 若集合中有两种不同的品种,则新水果可以获得 2 分。 若集合中只有一种品种,则新水果可以获得 1 分。 小爱可以自由决定将水果出口到哪个地区。请问应该怎么做才能获得的分数最多的分数? 请帮我写一份C++代码完成这个题目
时间: 2023-02-25 20:43:36 浏览: 66
下面是这道题目的 C 语言代码实现:
```
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,a[N],f[N][4];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
memset(f,-0x3f,sizeof f);
f[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=3;j++)
{
int t=j;
while(t<=3&&t>=0)
{
int k=(j-t+3)%3;
if(k==0)
f[i][t]=max(f[i][t],f[i-1][j]+1);
else if(k==1)
{
if(a[i]!=a[i-1])
f[i][t]=max(f[i][t],f[i-1][j]+2);
}
else if(k==2)
{
if(a[i]!=a[i-1]&&a[i]!=a[i-2])
f[i][t]=max(f[i][t],f[i-1][j]+3);
}
t=(t+m-1)%3;
}
}
}
cout<<max(f[n][0],max(f[n][1],f[n][2]))<<endl;
return 0;
}
```
阅读全文