简单的dp
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAX 1010
using namespace std;
int s[MAX],dp[MAX][MAX];
int n,l,c,cases=1;
void init(){
memset(dp,0x7f,sizeof(dp));
dp[0][0]=0;
}
int main(){
while(cin>>n&&n){
cin>>l>>c;
for(int i=1;i<=n;i++)
cin>>s[i];
init();
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
int temp=0;
for(int t=i;t>j-1;t--){
temp+=s[t];
if(temp>l)
break;
if(dp[t-1][j-1]==0x7f7f7f7f)//注意不一定所有的情况都能得到
continue;
if(temp==l)
dp[i][j]=min(dp[i][j],dp[t-1][j-1]);
else if(temp>=l-10)
dp[i][j]=min(dp[i][j],dp[t-1][j-1]-c);
else{
dp[i][j]=min(dp[i][j],dp[t-1][j-1]+(l-temp-10)*(l-temp-10));
}
}
}
}
/*for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}*/
if(cases!=1)
cout<<endl;
for(int i=1;i<=n;i++)
if(dp[n][i]!=0x7f7f7f7f){
printf("Case %d:\nMinimum number of lectures: %d\nTotal dissatisfaction index: %d\n",cases++,i,dp[n][i]);
break;
}
}
return 0;
}