UVA 1336 Fixing the Great Wall

原创 2016年08月29日 11:39:06

题目链接:http://acm.hust.edu.cn/vjudge/problem/36139


题意:一条直线上有n个点需要修理,每个点有一个修理费用ci和单位时间增加的费用di,如果在时刻t去修理,那么此点的费用为t*di+ci。给出起始坐标,求修复完全部点的最小话费。


思路:设f[i][j][k]为修复完区间[i,j]内的点且在当前区间的左端点(k=0)/右端点(k=1)时的最小花费,每一次前往一个点去修理需要花费时间t,那么所有还没被修理过的点就会产生∑di * t的额外花费,我们将某个点的花费按照时间拆开分段累加,这样就可以计算了。当前在某个区间[i,j]可以去i-1点修理或i+1点修理。

若向左走dp(i-1,j,0) = min( dp(i,j,0) + t(i->i+1) * ∑di  , dp(i,j,1) + t(j->i+1) * ∑di )。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 1000000001

const int maxn = 1009;

struct node
{
    int pos;
    int c;
    int add;
}p[maxn];

int n,v,stpos,st;

double dp[maxn][maxn][2];
LL sum[maxn];

bool cmp( node x , node y )
{
    return x.pos < y.pos;
}

void init()
{
    rep(i,1,n) scanf("%d%d%d",&p[i].pos,&p[i].c,&p[i].add);
    n++;
    p[n].pos = stpos;
    p[n].add = p[n].c = 0;
    sort( p + 1 , p + 1 + n , cmp );
    Clean(sum,0);
    rep(i,1,n)
        sum[i] = sum[i-1] + p[i].add;
}

double cal( int l , int r ) //计算除去[l,r]范围内的∑di
{
    return sum[l-1] + sum[n] - sum[r];
}

double cost( int x1 , int x2 ) //两点之间需要用的时间
{
    return (double)abs( p[x1].pos - p[x2].pos ) / (double)v;
}

void solve()
{
    rep(i,1,n)
    if ( p[i].pos == stpos )
    {
        st = i;
        break;
    }
    rep(i,1,n)
    if ( i == st ) dp[i][i][0] = dp[i][i][1] = 0; 
    else dp[i][i][0] = dp[i][i][1] = inf;
    rep(len,1,n-1)
        rep(l,1,n-len)
        {
            int r = l + len;
            double ex = cal( l+1 , r );
            dp[l][r][0] = min( dp[l+1][r][0] + ex * cost( l+1 , l ) , dp[l+1][r][1] + ex * cost( r , l ) );
            ex = cal( l , r - 1 );
            dp[l][r][1] = min( dp[l][r-1][0] + ex * cost( l , r ) , dp[l][r-1][1] + ex * cost( r - 1 , r ) );
        }
    double ans = min( dp[1][n][0] , dp[1][n][1] );
    rep(i,1,n) ans += p[i].c;
    printf("%d\n",(int)ans);
}

int main()
{
    while(cin>>n>>v>>stpos)
    {
        if ( n + v + stpos == 0 ) break;
        init();
        solve();
    }
    return 0;
}


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

[系统安装] 各种电脑进入BIOS方式

2013年十大笔记本品牌排名电脑
  • gopain
  • gopain
  • 2014年05月11日 14:16
  • 1099

UVa 10256 The Great Divide,判断两个凸包是否相离

先从给出的两个点集中分别计算出两个凸包, 然后判断两个凸包是否相离。 #include #include #include #include using namespace std; c...
  • yew1eb
  • yew1eb
  • 2014年08月20日 00:56
  • 1812

UVA11624 Fire! 两次BFS 读懂题意很重要

Fire! Joe works in a maze. Unfortunately,portions of the maze have caught on fire, and the owner of ...
  • wr132
  • wr132
  • 2015年04月30日 21:17
  • 1735

uva 1336 - Fixing the Great Wall

// // main.cpp // uva 1336 - Fixing the Great Wall /* 我们先按位置大小排序。 首先我们注意到: 对于 i ....x.....j,x表...
  • lovejava123qqq
  • lovejava123qqq
  • 2015年10月10日 17:57
  • 784

UVA 1336 Fixing the Great Wall(区间DP)

题意:修长城n个损坏点
  • u012962816
  • u012962816
  • 2014年11月19日 21:33
  • 1215

100道动态规划——18 UVA 1336 Fixing the Great Wall 指标函数的分解,刷表法

这道题目的在处理状态转移上面和我以前写过的一道题有点相似http://blog.csdn.net/good_night_sion_/article/details/52918040,这两个的思想是类似...
  • Good_night_Sion_
  • Good_night_Sion_
  • 2016年12月12日 07:45
  • 407

Uva-1336-Fixing the Great Wall

这个题大意是给你一些需要修复位置的坐标,以及修复他们的费用和等待单位...
  • z309241990
  • z309241990
  • 2014年07月18日 16:09
  • 1091

UVa #1336 Fixing the Great Wall (例题9-21)

这道题的动态规划部分还比较直观: 每次只有两个决策:向左走或者向右走。根据这个可以设计出状态:d(i,j,k)表示区间 [i,j] 已经被修复,目前处于最左端(k=0)或最右端(k=1)。 ...
  • ACM_HKBU
  • ACM_HKBU
  • 2015年03月05日 14:09
  • 1343

1336 - Fixing the Great Wall(DP)

本题极为经典,是动态规划中“未来费用”的计算, 因为起点固定且维修时间忽略,所以任意时间已经修复的点一定是一个连续的区间 。因此我们用d[i][j][k]表示已经修理完区间[i,j] 且现在正在点k...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015年07月20日 19:03
  • 1291

UVALive3181-Fixing the Great Wall(区间dp)

题目链接https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p...
  • Lzedo
  • Lzedo
  • 2016年09月10日 21:35
  • 193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 1336 Fixing the Great Wall
举报原因:
原因补充:

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