帮我写一份C++代码:小爱所在的地方盛产三种水果,三种水果的编号分别为 1,2,3。 在第i个月,小爱会得到一份水果,品种为a[i] 。小爱可以将水果出口到南极或北极。 南极与北极的消费者都喜欢不同品种的水果,他们对新进口水果的评价,与最近两次进口的水果品种有关。消费者会把这三份水果组成一个集合: 若集合中有三种不同的品种,则新水果可以获得 3 分。 若集合中有两种不同的品种,则新水果可以获得 2 分。 若集合中只有一种品种,则新水果可以获得 1 分。 小爱可以自由决定将水果出口到哪个地区。请问应该怎么做才能获得的分数最多的分数? 输入格式:第一行:单个整数表示 n。第二行:n 个数字表示a[1],a[2],a[3],...,a[n]。输出格式:单个整数:表示可以获得的最大分数之和。样例输入:15 2 2 2 3 2 1 1 1 3 2 2 1 1 2 3 样例输出:32
时间: 2023-02-25 20:59:41 浏览: 118
以下是C语言代码:
```
#include<stdio.h>
#include<string.h>
#define max_n 100005
#define max(a, b) (a > b ? a : b)
int n, a[max_n];
int dp[max_n][5];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
memset(dp, 0, sizeof dp);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= 3; j++)
{
if (a[i] == j)
{
dp[i][j] = max(dp[i - 1][j] + 1, dp[i - 1][6 - j - j] + 2);
}
else
{
dp[i][j] = max(dp[i - 1][j], dp[i - 1][6 - j - a[i]] + 3);
}
}
}
int ans = 0;
for (int i = 1; i <= 3; i++)
{
ans = max(ans, dp[n][i]);
}
printf("%d\n", ans);
return 0;
}
```
阅读全文