能看看哪里错了?
#include <iostream>

using namespace std;

int N , K , L;
int num[20010];
int sum[20010];
int f[20010][108];
int g[20010][108];

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

int main()
{
	int T;
	scanf(\"%d\" , &T);

	while(T --)
	{
		scanf(\"%d%d%d\" , &N , &K , &L);
		
		int i , j;
		for(i = 1 ; i <= N ; i ++)
		{
			scanf(\"%d\" , &num[i]);
			sum[i] = sum[i-1] + num[i];
		}
		
		memset(f , 0 , sizeof(f));
		for(i = 1 ; i <= N ; i ++)
		{
			f[i][1] = sum[i];
			g[i][1] = f[i][1] - sum[i]*2;
		}

		for(i = L+1 ; i <= N ; i ++)
			g[i][1] = MIN(g[i][1] , g[i-1][1]);

		for(i = 1 ; i <= N ; i ++)
		{
			for(j = 2 ; j <= i / L && j <= K ; j ++)
			{
				f[i][j] = g[i][j-1] + sum[i]*j;
				g[i][j] = f[i][j] - sum[i]*(j+1);
				if(i > j*L)
					g[i][j] = MIN(g[i-1][j] , g[i][j]);
			}
		}

		int res = f[N][1];
		for(i = 1 ; i <= N / L ; i ++)
			res = MIN(f[N][i] , res);
		printf(\"%d\\n\" , res);
	}

	return 0;
}
© 2015 HUST ACMICPC TEAM. All Right Reserved.