60ptsWA(别管那个TLE,常数问题)
P1777
#include<bits/stdc++.h>
using namespace std;
int n,k,S=0,T=0;
int f[105][105][257][10],h[105];
int calc(int x,int y){
int u=y-x;
int sum=0;
while(u){
u^=(u&(-u));
sum++;
}return sum;
}
int main(){
while(1){
int res=999999999,S=0;
T++;
scanf("%d%d",&n,&k);
if(n==0&&k==0){
break;
}memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++){
scanf("%d",&h[i]);
h[i]=h[i]-25;
S=S|(1<<h[i]);
}f[1][0][1<<h[1]][h[1]]=1;
for(int i=2;i<=n;i++){
for(int j=0;j<=k;j++){
for(int l=0;l<=255;l++){
for(int r=0;r<=8;r++){
if(j)f[i][j][l][r]=min(f[i][j][l][r],f[i-1][j-1][l][r]);
}for(int r=0;r<=8;r++){
f[i][j][l|1<<h[i]][h[i]]=min(f[i][j][l|1<<h[i]][h[i]],f[i-1][j][l][r]+(r!=h[i]));
}
}
}
}for(int l=0;l<=255;l++){
for(int r=0;r<=8;r++){
res=min(res,f[n][k][l][r]+calc(l,S));
}
}
printf("Case %d: %d\n\n",T,res);
}
return 0;
}