ZOJ 3469(区间DP)

原创 2015年11月17日 20:02:26
//第一次做区间DP的题 看了别人的题解写的
//解法只要将各个点(包括餐厅的位置)按照距离原点的距离升序排序
//然后从餐厅这个点开始向两侧区间DP
// dp[i][j][0] 表示 当前点送完了区间[i,j]的外卖并且在区间的左端点I点
// dp[i][j][1] 表示 当前点送完了区间[i,j]的外卖并且在区间的右端点J点
//那么dp[i][j][0] 可由dp[i+1][j][0] 和 dp[i+1][j][1] 推出
//        dp[i][j][1] 可由dp[i][j-1][0] 和  dp[i][j-1][1]  推出
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "algorithm"
#include <queue>
#include <stack>
#define N 100005

#define INF 1<<30
using namespace std;
int dp[1005][1005][2];
int sum[1005];

struct node {
    int x, v;
}point[1005];

int cmp(node a, node b)
{
    return a.x < b.x;
}

int cal(int a, int b)
{
    return sum[b]-sum[a - 1];
}
int main()
{
    int n, v, x, op;
    //freopen("t", "r", stdin);
    while(scanf("%d%d%d", &n, &v, &x) != EOF)
    {
        for(int i = 1; i <= n; i++)
            scanf("%d%d", &point[i].x, &point[i].v);
        point[++n].x = x, point[n].v = 0;
        sort(point+1, point+n+1, cmp);
        sum[0] = 0;
        for(int i = 1; i <= n; i++)
        {
            if(point[i].x == x )
            {
                op = i;
            }
            sum[i] = sum[i-1] + point[i].v;
        }

        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                dp[i][j][0] = dp[i][j][1] = INF;

        dp[op][op][0] = dp[op][op][1] = 0;

        for( int i = op; i >= 1; i--)
            for( int j = op; j <= n; j++)
            {
                int cost = cal(1, i - 1) + cal(j + 1, n);
                if(i == j) continue;
                dp[i][j][0] = min( dp[i][j][0] , dp[i + 1][j][0] + (point[i+1].x - point[i].x) * ( cost + point[i].v) );
                dp[i][j][0] = min( dp[i][j][0] , dp[i + 1][j][1] + (point[j].x - point[i].x) * ( cost +point[i].v ) );
                dp[i][j][1] = min( dp[i][j][1] , dp[i][j - 1][0] + (point[j].x - point[i].x)  * (cost + point[j].v ) );
                dp[i][j][1] = min( dp[i][j][1] , dp[i][j - 1][1] + (point[j].x - point[j-1].x) * (cost + point[j].v ) );
            }

        printf("%d\n", v*(min( dp[1][n][0], dp[1][n][1])));
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

zoj3469(区间dp)

链接:点击打开链接 题意:在x轴上有n个客人,每个客人每秒增加的愤怒值不同。给出客人和餐厅的位置,以及客人每分钟增加的愤怒值,和送餐行走一公里需要的时间,问送完n个客人的外卖最小愤怒值 代码:#inc...

ZOJ 3469Food Delivery(区间DP)

ZOJ 3469Food Delivery(区间DP)
  • Dacc123
  • Dacc123
  • 2016年03月29日 08:51
  • 173

ZOJ 3469 Food Delivery (区间DP)

题意一个外卖员要从x出发,送一条线上的n个人的外卖,每个人都有一个不满意度,这个会随着时间变化而增加,求送完所有人家外卖之后最低的不满意度。思路dp[l][r][0/1]表示送完了l和r这段区间之后,...

zoj3469(区间DP)

地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4255

ZOJ - 3469 Food Delivery (区间dp)

传送门 When we are focusing on solving problems, we usually prefer to stay in front of computers rath...

zoj3469——Food Delivery(区间dp)

When we are focusing on solving problems, we usually prefer to stay in front of computers rather tha...

ZOJ3469:Food Delivery(区间DP)

When we are focusing on solving problems, we usually prefer to stay in front of computers rather tha...

ZOJ-3469-Food Delivery(区间DP)

Description When we are focusing on solving problems, we usually prefer to stay in front of compu...

ZOJ-3469 Food Delivery(区间dp)

F - Food Delivery  ZOJ - 3469  题意:在x轴上有n个客人,每个客人每秒增加的愤怒值不同。给出客人和餐厅的位置, 以及客人每分钟增加的愤怒值,和送...

zoj 3469 Food Delivery (区间DP)

题意:你是一个餐馆的送餐员,现在要送n个人的餐。坐标是一维的,餐馆的坐标为x,你的速度为v^-1。 每个送餐的人有一个坐标Xi和一个不开心值Wi,如果这个人餐是第K时间送到的,这个人的不开心值就是K...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZOJ 3469(区间DP)
举报原因:
原因补充:

(最多只允许输入30个字)