码迷,mamicode.com
首页 > 其他好文 > 详细

LA 4987 背包

时间:2017-06-25 16:08:00      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:nbsp   容量   struct   位置   blog   style   int   splay   二维   

题意:

有n个施工队,给定他们的位置,有m个防空洞,给定位置,求将施工队放到m个防空洞里面,最少的总距离?

n<=4000

分析:

dp[i][j] 前 i 个施工队,放到前 j 个防空洞里面的最少距离;

dp(i+1,j) = min(dp(i,j),dp(i,j-1)) + dist(a[i] - b[j]);

DP采用滚动数组;

那么,第二维的防空洞该怎么循环呢?

因为,每个防空洞都要有,那么这类似于背包中的容量,刷表的方式;

技术分享
#include <bits/stdc++.h>

using namespace std;

const int maxn = 4000+5;
const int inf = 0x3f3f3f3f;

struct node {
    int d;
    int id;
    int ans;
}A[maxn],B[maxn];

long long dp[maxn];
int path[maxn][maxn];
int n,m;

bool cmp(node a,node b) {
    if(a.d==b.d)
        return a.id < b.id;
    return a.d < b.d;
}

void find_path(int i,int j) {
    if(i)
        find_path(i-1,path[i][j]);
    A[i].ans = B[j].id;
}

int cmp1(node a,node b) {
    return a.id < b.id;
}

int main()
{
    while(~scanf("%d",&n)) {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&A[i].d);
            A[i].id = i;
        }

        scanf("%d",&m);
        for(int i=0;i<m;i++) {
            scanf("%d",&B[i].d);
            B[i].id = i;
        }

        sort(A,A+n,cmp);
        sort(B,B+m,cmp);

        memset(dp,inf,sizeof(dp));
        dp[0] = abs(A[0].d-B[0].d);

        for(int i=1;i<n;i++) {
            for(int j=min(m-1,i);j>=0;j--) {
                if(!j||dp[j]<dp[j-1]) {
                    path[i][j] = j;
                    dp[j] = dp[j] + abs(A[i].d-B[j].d);
                }
                else {
                    path[i][j] = j-1;
                    dp[j] = dp[j-1] + abs(A[i].d - B[j].d);
                }
            }
        }

        printf("%lld\n",dp[m-1]);
        find_path(n-1,m-1);
        sort(A,A+n,cmp1);

        for(int i=0;i<n;i++)
            printf("%d ",A[i].ans+1);
        puts("");


    }
    return 0;
}
View Code

 

LA 4987 背包

标签:nbsp   容量   struct   位置   blog   style   int   splay   二维   

原文地址:http://www.cnblogs.com/TreeDream/p/7076961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!