题目描述
有n个数(2≤n≤100)排成一排,从n个数中任取若干个数,取数规则为每次取相邻的2个数,不能取1个,也不能取多于2个连续的数,找一种取法,使取到数的和为最大。
例如:n=6 6个数
13 2 17 14 8 16
其中和最大的为43
输入
第1行一个整数n,第2行n个整数
输出
一个整数,即合理取法中最大的和。
样例输入 Copy
6
12 7 8 14 9 13
样例输出 Copy
42
``#include<bits/stdc++.h>
#define MX 100
using namespace std;
int a[MX + 10] = {0};
int main()
{
int n,i,j,k;
long long ans = 0,ma = -1;
cin >> n;
for (i = 1;i <= n;i++)
{
cin >> a[i];
}
for (i = 1;i < n;i++)
{
ans = 0;
ans += a[i] + a[i + 1];
for (j = i + 3;j <= n;)
{
if (j >= n)
{
break;
}
int p = 0,q = 0,mx = -1;
if (ans + a[j] + a[j + 1] > ans)
{
for (k = j;k < n;k++)
{
mx = max(mx,a[k] + a[k + 1]);
}
for (k = j;k < n;k++)
{
if (a[k] + a[k + 1] == mx)
{
p = k;
q = p + 1;
}
}
if (p - 2 <= j)//最大值和a[j] + a[j + 1]不相容
{
ans += mx;
j = q + 2;
}
else//相容,那么以后再取最大值也不迟
{
ans += a[j] + a[j + 1];
j += 3;
}
}
else
{
j++;
}
}
ma = max(ma,ans);
}
cout << ma << endl;
return 0;
}`