# Description

Petya puts the $N$ white balls in a line and now he wants to paint some of them in black, so that at least two black balls could be found among any $M$ successive balls.
Petya knows that he needs $C_i$ milliliters of dye exactly to paint the $i$-th ball.
Your task is to find out for Petya the minimum amount of dye he will need to paint the balls.

# Input

The first line contains two integer numbers $N and M (2<=N<=10000, 2<=M<=100, M<=N)$.
The second line contains $N$ integer numbers $C_1, C_2, ..., C_N (1 \le C_i \le10000)$.

# Output

Output only one integer number - the minimum amount of dye Petya will need (in milliliters).

6 3
1 5 6 2 1 3

# Sample Output

9

$f[i][j]$表示最后一个黑球在$i$倒数第二个黑球在$i-j$的最小值。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

const int maxn = 10010,maxm = 110,inf = 1<<30;
int N,M,C[maxn],f[maxn][maxm],g[maxn][maxm],ans = inf;

inline int gi()
{
char ch; int ret = 0,f = 1;
do ch = getchar(); while (!(ch >= '0'&&ch <= '9')&&ch != '-');
if (ch == '-') f = -1,ch = getchar();
do ret = ret*10+ch-'0',ch = getchar(); while (ch >= '0'&&ch <= '9');
return ret*f;
}

int main()
{
freopen("3037.in","r",stdin);
freopen("3037.out","w",stdout);
N = gi(); M = gi();
for (int i = 1;i <= N;++i) C[i] = gi();
for (int i = 0;i <= N;++i) for (int j = 0;j <= M;++j) g[i][j] = f[i][j] = inf;
for (int i = 1;i <= M;++i) for (int j = 1;j < i;++j) f[i][j] = C[i]+C[i-j],g[i][j] = min(g[i][j-1],f[i][j]);
for (int i = M+1;i <= N;++i) for (int j = 1;j < M;++j) f[i][j] = g[i-j][M-j]+C[i],g[i][j] = min(g[i][j-1],f[i][j]);
for (int i = 1;i <= M;++i) for (int j = 1;j < i;++j) ans = min(ans,f[N-M+i][j]);
cout << ans << endl;
fclose(stdin); fclose(stdout);
return 0;
}

posted @ 2017-02-15 23:17  lmxyy  阅读(137)  评论(0编辑  收藏