首页 > 其他 > 详细

【poj】1160 Post Office

时间:2014-03-03 17:53:24      阅读:377      评论:0      收藏:0      [点我收藏+]

还是DP,这题最开始想复杂了。移位前i个邮局确立后,想要再添加个邮局无法保证刚好在余下的部分。其实这道题,可以简单理解为先确立后i个邮局,则在确立i+1个邮局时,最后一个邮局是新添加线段的重点。而且,数组略开大点儿,否则RE。这还是第一次RE,还以为RE是要把cin/cout替换为scanf/printf呢,结果搞到现在。ACM和算法还得继续研究啊,DP的题目现在自己可以动手做很多了,水题wa几次也可以ac。下周继续。

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

【poj】1160 Post Office,布布扣,bubuko.com

【poj】1160 Post Office

原文:http://www.cnblogs.com/bombe1013/p/3577654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!