环形DP,我分了四种情况,首先分第一个数取或不取,这影响到最后的值的取舍,然后每种情况又分两种,即前面的数取或没有取,四种情况分别递推最大值就行。用了滚动数组想优化掉memcpy的时间,结果发现没啥用。。
#include<stdio.h>
#include<string.h>
static int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int a, b;
if (n == 1)
{
scanf("%d", &a);
printf("%d\n", a);
}
else if (n == 2)
{
scanf("%d %d", &a, &b);
printf("%d\n", max(a, b));
}
else
{
scanf("%d %d", &a, &b);
int i, num, dp[2][2][2], now, next;
dp[0][0][0] = 0, dp[0][0][1] = b, dp[0][1][0] = a, dp[0][1][1] = a;
for (i = 2; i < n; i++)
{
scanf("%d", &num);
now = i & 1;
next = 1 - now;
dp[next][0][0] = max(dp[now][0][1], dp[now][0][0]);
dp[next][0][1] = max(dp[now][0][0] + num, dp[now][0][1]);
dp[next][1][0] = max(dp[now][1][1], dp[now][1][0]);
dp[next][1][1] = max(dp[now][1][0] + num, dp[now][1][1]);
}
printf("%d\n", max(dp[next][0][1], dp[next][1][0]));
}
}
return 0;
}