Problem:
D: 水槽

問題

AORイカちゃんは縦 $1$ 横 $N$ の大きさの水槽をもらった。水槽は水を入れるのに十分な高さがある。
水槽には $N-1$ 個の仕切りがあり $N$ 個の区画に等間隔に区切られている。
ここに水を注いだところ、各区画の水の高さは $a_i$ になった。

AORイカちゃんはいくつか仕切りを取り除き、区画の数を $M$ 個以下にすることにした。
仕切りを取り除き終わった時、各区画の水の高さの総和の最大値を求めよ。

なお、仕切りの厚さは無視できるものとする。

制約

$1 \le N \le 500$

$1 \le M \le N$

$1 \le a_i \le 10^9$

入力は全て整数

入力

$N \ M$

$a_1 \cdots a_N$

出力

各区画の水の高さの総和の最大値を一行で出力せよ。また末尾に改行を出力せよ。
相対誤差または絶対誤差が $10^{-6}$ 以下であれば許容される。

サンプル

サンプル入力 1

5 3
9 1 2 3 9

サンプル出力 1

20.000000

$a_2$ と $a_3$ 、$a_3$ と $a_4$ の間の仕切りをとると、その区画の水の高さは $\frac{(1 + 2 + 3)}{3} = 2$ となる。
各区画の水の高さは $9 \ 2 \ 9$ となりこれが最大である。

サンプル入力 2

4 1
14 4 9 7

サンプル出力 2

8.500000

サンプル入力 3

8 3
11 18 9 20 4 18 12 14

サンプル出力 3

44.666667

Solution in C (judge verdict: Wrong Answer)

#include <stdio.h>


int main(void){
    int N,M;
    scanf("%d %d",&N,&M);
    int a[N];
    double ruiseki[N+1];
    ruiseki[0]=0;
    for(int i=0;i<N;i++){scanf("%d",&a[i]);ruiseki[i+1]=ruiseki[i]+a[i];}
    double dp[2][N-M+1][N-M+1];
    for(int i=0;i<2;i++)for(int j=0;j<N-M+1;j++)for(int k=0;k<N-M+1;k++){dp[i][j][k]=0.0f;}
    dp[0][0][0]=(double)a[0];
    dp[1][0][0]=(double)a[0];
    for(int i=1;i<N;i++){
        for(int j=0;j<N-M+1&&j<i;j++){
            double max=0;
            for(int k=0;k<=j;k++)if(max<dp[0][j][k])max=dp[0][j][k];
        dp[1][j][0]=max+a[i];
        }
        for(int j=1;j<N-M+1&&j<=i;j++)for(int k=1;k<=j;k++){
            dp[1][j][k]=dp[0][j-1][k-1]+(double)(ruiseki[i+1]-ruiseki[i-k])/(k+1)-(double)(ruiseki[i]-ruiseki[i-k])/k;
        }
        for(int j=0;j<N-M+1;j++)for(int k=0;k<N-M+1;k++)dp[0][j][k]=dp[1][j][k];
    }
    double ans=0;
    for(int k=0;k<N-M+1;k++)if(ans<dp[1][N-M][k])ans=dp[1][N-M][k];
    printf("%f",ans);
    return 0;
}