|
思路:
f[倒数第几天][队列头的位置] = { 该状态下所产生的最大值 } 状态转移: f[i][j] = max { V[j + i]*(N - i) + f[i - 1][j], f[i - 1][j + 1] + V[j]*(N - i) }
代码:
#include <stdio.h>

inline int max(int a, int b)
  {
return a > b ? a : b;
}

int N, V[2048], f[2][2048], *cur, *pre;

int main()
  {
int i, j;

freopen("e:\\test\\in.txt", "r", stdin);

scanf("%d", &N);
 for (i = 0; i < N; i++) {
scanf("%d", &V[i]);
f[1][i] = V[i]*N;
}
 for (i = 1; i < N; i++) {
pre = f[i & 1];
cur = f[(i + 1) & 1];
for (j = 0; j < N - i; j++)
cur[j] = max(pre[j] + V[j + i]*(N - i), pre[j + 1] + V[j]*(N - i));
}
printf("%d\n", cur[0]);

return 0;
}

|