PKU-3186: Treats for the Cows

keyword

メモ化再帰 C

問題概要

dequeに配列(長さN<2000)が詰まっている。i番目に取り出した要素をv_iとしたとき、Σ i*v_iを最大化する問題。

解法

Greedyでは駄目らしい。のでメモ化再帰して解く。memo[from][to]は[from, to)が残ったときに得られる最大値。計算量O(N^2)。

long long memo[2002][2002];
int as[2002];
int N;

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

long long solve(int from, int to){
    int day = N - (to - from) + 1;
    if(memo[from][to]) return memo[from][to];
    if(day==N)
        return memo[from][to] = N*as[from];
    return memo[from][to] = max(solve(from+1,to)+day*as[from], solve(from,to-1)+day*as[to-1]);
}

main(){
    int i;
    scanf("%d",&N);
    for(i=0;i<N;i++)
        scanf("%d",as+i);
    printf("%lld\n",solve(0,N));
}