还是DP,这题最开始想复杂了。移位前i个邮局确立后,想要再添加个邮局无法保证刚好在余下的部分。其实这道题,可以简单理解为先确立后i个邮局,则在确立i+1个邮局时,最后一个邮局是新添加线段的重点。而且,数组略开大点儿,否则RE。这还是第一次RE,还以为RE是要把cin/cout替换为scanf/printf呢,结果搞到现在。ACM和算法还得继续研究啊,DP的题目现在自己可以动手做很多了,水题wa几次也可以ac。下周继续。
#include <iostream> using namespace std; #include <stdlib.h> #define MAXNUM 305 #define MAXVAL 0x7f int mymin(int a, int b) { return a<b ? a:b; } int main() { int v, p; int pos[MAXNUM]; int i, j, k, tmp; int only1[MAXNUM][MAXNUM]; int dis[MAXNUM][MAXNUM]; while (scanf("%d %d", &v, &p) != EOF) { for (i=0; i<v; ++i) scanf("%d", &pos[i]); for (i=0; i<v; ++i) { for (j=i; j<v; ++j) { int mid = (i+j)>>1; tmp = 0; for (k=i; k<=j; ++k) { tmp += abs(pos[k] - pos[mid]); } only1[i][j] = tmp; } } memset(dis, MAXVAL, sizeof(dis)); for (i=0; i<v; ++i) dis[1][i] = only1[0][i]; for (i=1; i<p; ++i) { for (j=0; j<v; ++j) { for (k=0; k<v-j; ++k) { dis[i+1][j+k] = mymin(dis[i][j]+only1[j+1][j+k], dis[i+1][j+k]); } } } printf("%d ", dis[p][v-1]); } return 0; }