题目链接:https://vjudge.net/problem/HihoCoder-1636;
题意:n堆石子,每次可以合并连续的 [ L~R ]堆石子,求最少的代价;
/*
思路:区间DP;
dp[i][j][num]表示i~j分成num堆的最小代价;所以dp[i][j][j-i+1]=0;
对相应的区间分成成任意堆合成:dp[i][j][num]=min(dp[i][k][num-1]+dp[k+1][j][1]) num属于[2~j-i+1];
i~j合成可能是用l~r堆合成的最小值:dp[i][j][1]=min(dp[i][j][1]+sum[j]-sum[i-1]); num属于[l~r]
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f3f3f3f3f;
const int N=105;
ll dp[N][N][N];
ll a[N],sum[N];
int main()
{
ll n,l,r;
while(~scanf("%lld %lld %lld",&n,&l,&r))
{
memset(sum,0,sizeof(sum));
memset(dp,inf,sizeof(dp));
for(ll i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(ll i=1;i<=n;i++)
{
for(ll j=i;j<=n;j++)
dp[i][j][j-i+1]=0;
}
for(ll len=2; len<=n; len++)
{
for(ll i=1; i+len-1<=n; i++)
{
ll j=i+len-1;
for(ll k=i;k<j;k++)
{
for(ll num=2;num<j-i+1;num++)
dp[i][j][num]=min(dp[i][k][num-1]+dp[k+1][j][1],dp[i][j][num]);
}
for(ll num=l;num<=r;num++)
dp[i][j][1]=min(dp[i][j][1],dp[i][j][num]+sum[j]-sum[i-1]);
}
}
ll ans=dp[1][n][1];
if(ans>=inf) printf("0\n");
else printf("%lld\n",ans);
}
return 0;
}