HDU 1421 搬起居室
HDU 1421 搬寝室
/* 状态转移方程:d[i][j] = min(d[i][j - 1], d[i - 1][j - 2] + (A[j] - A[j - 1]) * (A[j] - A[j - 1])) d[i][j]:表示前j个物品搬运i次最小的疲劳度 */ #include <iostream> #include <cmath> using namespace std; const int nMax = 2002; const int INF = 0xfffffff; int d[nMax][nMax]; int n, k; int A[nMax]; int fmin(int a, int b) { return a < b ? a : b; } int cmp(const void *a, const void *b) { int *pa = (int *) a; int *pb = (int *) b; return *pa - *pb; } int main() { //freopen("e://data.in", "r", stdin); while(scanf("%d%d", &n, &k) != EOF) { int i, j; for(i = 0; i < n; ++ i) scanf("%d", &A[i]); qsort(A, n, sizeof(A[0]), cmp); int min = INF; for(i = 0; i <= k; ++ i)//如果遇到不可访问节点,则需要定义为INF { for(j = 0; j <= n; ++ j) d[i][j] = INF; } for(i = 1; i <= k; ++ i) { for(j = 2 * i - 1; j < n; ++ j) { if(i == 1) //这里更好的处理方法是将d[0][]全部定义为0,所以先写主程序,再处理边界 d[i][j] = fmin(d[i][j - 1], (A[j] - A[j - 1]) * (A[j] - A[j - 1])); else d[i][j] = fmin(d[i][j - 1], d[i - 1][j - 2] + (A[j] - A[j - 1]) * (A[j] - A[j - 1])); } } printf("%d\n", d[k][n - 1]); } return 0; }