【POJ】1160 Post Office

还是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\n", dis[p][v-1]);
    }


    return 0;
}

 

 

posted on 2014-03-03 04:44  Bombe  阅读(347)  评论(0编辑  收藏  举报

导航