[BZOJ1694/1742/3074]The Cow Run 三倍经验

Description

John养了一只叫Joseph的奶牛。一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草。我们可
以认为草地是一个数轴上的一些点。Joseph看到这些草非常兴奋,它想把它们全部吃光。于是它开始左右行走,吃
草。John和Joseph开始的时候站在p位置。Joseph的移动速度是一个单位时间一个单位距离。不幸的是,草如果长
时间不吃,就会腐败。我们定义一堆草的腐败值是从Joseph开始吃草到吃到这堆草的总时间。Joseph可不想吃太腐
败的草,它请John帮它安排一个路线,使得它吃完所有的草后,总腐败值最小。John的数学很烂,她不知道该怎样
做,你能帮她么?

Input

* Line 1 : Two space-separated integers: N and L. N<=1000
* Lines 2..N+1: Each line contains a single integer giving the position P of a clump (1 <= P <= 1,000,000).

Output

* Line 1: A single integer: the minimum total staleness Bessie can achieve while eating all the clumps.

Sample Input

4 10
1
9
11
19
INPUT DETAILS:
Four clumps: at 1, 9, 11, and 19. Bessie starts at location 10.

Sample Output

44
OUTPUT DETAILS:
Bessie can follow this route:
* start at position 10 at time 0
* move to position 9, arriving at time 1
* move to position 11, arriving at time 3
* move to position 19, arriving at time 11
* move to position 1, arriving at time 29
giving her a total staleness of 1+3+11+29 = 44. There are other routes
with the same total staleness, but no route with a smaller one.44
 
 

 
 
感觉翻译的不太好..但也能看2333.
发现了三倍经验,但都是权限题2333.
对于我这种非权限汪很不友好...
然而凭借三道题成功将yousiki学长刷题量冲到日榜第45...
虽然不知道干了些什么昨天我日榜第5.玄学我都不知道昨天做了些什么2333;
 
吐槽结束。
水水的区间dp秒出思路,,,
设f[i][j][0/1]表示处理完了i~j区间,现在在左端点/右端点的最小损失。
于是f[i][j][0] 可以从 f[i+1][j][0/1]转移过来,f[i][j][1] 可以从 f[i][j-1][0/1]转移过来。。
我也是第一次见区间dp没有枚举k...见识太少了233
 

 
贴那篇题解呢。。。
对了注意bzoj3074和另外两个不太一样,从输入可以看出来。
这里贴bzoj1694的。
// By BriMon
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
inline int read(){
    int res=0;char ch=getchar();
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)){res=(res<<3)+(res<<1)+(ch^48);ch=getchar();}
    return res;
}

int n, x;
int f[1005][1005][2], pos[1005];

int main()
{
    n = read(), x = read();
    for (int i = 1 ; i <= n ; i ++)
        pos[i] = read();
    sort(pos + 1, pos + 1 + n);
    memset(f, 0x3f, sizeof f);
    for (int i = 1 ; i <= n ; i ++) f[i][i][0] = f[i][i][1] = abs(x - pos[i]) * n;
    for (int len = 2 ; len <= n ; len ++)
    {
        for (int i = 1 ; i <= n ; i ++)
        {
            int j = i + len - 1;
            if (j > n) break;
            f[i][j][0] = min(f[i][j][0], min(f[i+1][j][1] + (n - (j - i)) * (pos[j] - pos[i]), f[i+1][j][0] + (n - (j - i)) * (pos[i+1] - pos[i])));
            f[i][j][1] = min(f[i][j][1], min(f[i][j-1][1] + (n - (j - i)) * (pos[j] - pos[j-1]), f[i][j-1][0] + (n - (j - i)) * (pos[j] - pos[i])));
        }
    }
    printf("%d\n", min(f[1][n][1], f[1][n][0]));
    return 0;
}

 

posted @ 2018-08-03 17:45  zZhBr  阅读(216)  评论(0编辑  收藏  举报