Description: state equation p [I] [j] = dp [I-1] [k] + dist (k + 1, j), since I didn't understand how to calculate the distance dist, if it is num [j]-num [k + 1], the result is wa once. When the status is transferred, use an array SC to record the node position # include <cstdio> # include <cstring> # define N 0x7fffffff; int num [210]; int dp [35] [210]; int SC [35] [1, 210]; void show (int cur, int pos) {if (cur> 1) show (cur-1, SC [cur] [pos]-1); printf ("Depot % d at restaurant % d serves", cur, (pos + SC [cur] [pos]) /2); if (pos-SC [cur] [pos]> 0) printf ("restaurants % d t O % d \ n ", SC [cur] [pos], pos); else printf (" restaurant % d \ n ", pos);} int dist (int x, int y) {int v = 0, cur = (x + y)/2, p; for (int I = x; I <= y; ++ I) {p = (num [cur]-num [I]); if (p <0) p =-p; v + = p;} return v;} int main () {// freopen ("in.txt", "r", stdin); int n, m, t = 1; while (scanf ("% d", & n, & m )! = EOF) {if (! N &&! M) break; for (int I = 1; I <= n; ++ I) scanf ("% d", & num [I]); for (int I = 1; I <= n-m + 1; ++ I) dp [1] [I] = dist (1, I ), SC [1] [I] = 1; for (int I = 2; I <= m; ++ I) for (int j = I; j <= n-m + I; ++ j) {dp [I] [j] = N; for (int k = I-1; k <j; ++ k) {int v = dist (k + 1, j); if (dp [I] [j]> dp [I-1] [k] + v) dp [I] [j] = dp [I-1] [k] + v, SC [I] [j] = k + 1 ;}} printf ("Chain % d \ n", t ++); show (m, n); printf ("Total distance sum = % d \ n ", dp [m] [n]) ;}}