TYVJ 1059 过河 解题报告
考的是动态规划的状态压缩吧,两个石子之间的距离若大于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; }