考的是动态规划的状态压缩吧,两个石子之间的距离若大于100就变成100,就压缩下来了。然后方程是f[i] = min{f[i - j]} + map[i];
代码:
#include <stdio.h>
#include <stdlib.h>
int map[10101];
int f[10101];
int stone[101];
int com(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main(int argc, char **argv)
{
int i, j;
int s, t, min;
int n, m, base = 0;
scanf("%d%d%d%d", &n, &s, &t, &m);
for(i = 1; i <= m; i++){
scanf("%d", &stone[i]);
}
if(s == t){
for(i = 1; i <= m; i++){
if(stone[i] % s == 0){
base++;
}
}
printf("%d\n", base);
return 0;
}
qsort(&stone[1], m, sizeof(int), com);
for(i = 1; i <= m; i++){
j = stone[i];
if(stone[i] - base > 100){
stone[i] = stone[i - 1] + 100;
}else{
stone[i] = stone[i] - base + stone[i - 1];
}
base = j;
map[stone[i]] = 1;
}
n = stone[m] + t;
for(i = 1; i <= n; i++){
f[i] = 0xFFFFFFF;
}
for(i = s; i <= n; i++){
min = 0XFFFFFFF;
for(j = s; j <= t; j++){
if(min > f[i - j]){
min = f[i - j];
}
}
f[i] = min + map[i];
}
printf("%d\n", f[n]);
return 0;
}