阿里巴巴(區間dp)

2021-08-07 02:12:56 字數 2355 閱讀 9714

【問題描述】

在一條直線上有 n 件珠寶,已知每件珠寶的位置xi,並且第 i 件珠寶在 ti 時刻(單位:秒)就消失,問能否將所有的珠寶收集起來?如果能,求出最短時間。蒐集能瞬間完成,但收集的人每秒只能移動乙個單位的距離。

【輸入格式】
若干組資料,每組資料的第一行為n,表示有n顆珠寶,接下來的n行,每行寶行兩個整數:x,t,表示珠寶的位置和消失時間。

【輸出格式】
如果有解,則輸出乙個整數,表示將所有珠寶收集完的最早完成時間,否則輸出no solution。

【輸入樣例】
5

1 3

3 1

5 8

8 19

10 15

5 1 5

2 1

3 4

4 2

5 3

【輸出樣例】
11

no solution

【資料範圍】
n<=10000

0<=x,t<=10^9

注意:在t[i]時刻走到i點不算拿到寶石

錯誤的貪心1:找乙個點先往左後往後或者先往右再往左,因為可能為了t折返幾次,因此貪心不對

錯誤的貪心2:找t最小的,很明顯t足夠大的時候(隨便怎麼走無所謂)找到的很可能不是最優解,但這個貪心是可以ac的

dp,這是個很不錯的區間dp

dp面臨的問題是起點和終點可能有多種情況,面對終點問題,有分析得我們可以很輕鬆的知道要麼最後停留在左端點,要麼停留在右端點,因此開兩個狀態即可

接下來討論起點的問題,我們是否可以和終點一樣f(i,j)表示以i為起點並且允許i>j,這樣最後單獨列舉起點計算答案,這樣問題就和錯誤的貪心1一樣遇到需要折返的問題則無從下手,同時不能直接寫出答案還要用這種方法搜尋感覺的確不滿足最優子結構

那麼到底該怎麼做呢,在查閱了網上資料後,我發現可以直接定義:

f(i,j,0)表示區間i~j中獲得所有寶藏並且停留在左端點的最小時間,f(i,j,1)停留在右端點

那麼疑惑的問題就來了,如何保證第一次正好是從任意節點出發,並且其他節點總是連貫呢?

以左端點為例,我們先把區間拆成i~i+1和i+1~j,那麼我們可以把這個任意的起始點放在i+1~j中,形成了乙個完全相同的子問題,然後在走到左端點去,轉移的時候要用到停留在i+1和停留在j的兩種情況一起轉移,因為他們的答案完全可能不同,

至於那個t,就只需要在單獨隔離乙個元素的時候考慮是否達到了期限,達到了就把值賦成inf即可。

方程答案與轉移如下

f(i,j,0)表示區間i~j中獲得所有寶藏並且停留在左端點,f(i,j,1)停留在右端點

ans=min(f(1,n,0),f(1,n,1))

i=j時,f(i,j,0)=f(i,j,1)=0;

f(i,j,0)=min(f(i+1,j,1)+x[i+1]-x[i],f(i+1,j,0)+x[j]-x[i])

f(i,j,1)=min(f(i,j-1,0)+x[j]-x[j-1],f(i,j-1,1)+x[j]-x[i])

填表的時候需要按照主對角線填入

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1e4+5,inf=2e9+5;

struct data

}ans=min(d[1&1][n][0],d[1&1][n][1]);

if(ansprintf("%d\n",ans);

else

printf("no solution\n");

}int main()

sort(a+1,a+n+1);

solve();

}return

0;}

注意

1、這裡為了節省空間必須要用到填表+滾動陣列,再者因為區間dp是從兩邊往中間收攏的,因此一般按照主對角線填表,注意如果保證i<=j,那麼應該從中間往右上角填表

2、inf應該是個常見技巧,就不多說了

1、分析物件的時候搞清楚主要矛盾,我們的最優值肯定是求最短時間,因此deadline可以放一放,最後想想辦法就可以搞定

2、在感覺到一道題要用dp的時候但是明顯發現這道題的起點和終點有多個,那麼就找最有代表性的點作為狀態,可以有多個

3、區間dp不一定要多個區間合併,也可以用端點縮小法

4、見**注意的程式收穫

UVa 1632 阿里巴巴(區間DP)

題意 直線上有n個點,其中第i個點的座標是xi,且它會在di秒之後消失。alibaba可以從任意位置出發,求訪問完所有點的最短時間。思路 區間dp。d i j 0 用來表示訪問完區間 i j 之間所有點的最短時間,並且此時處於 i 點,相反的,d i j 1 表示的是處於 j 點。1 include...

阿里巴巴AI Pandas

1.series 主要用於處理一維資料,一般由乙個陣列的資料構成。2.dataframe 主要用於處理二維資料。from pandas import series,dataframe series eg import pandas as pd s1 pd.series 1,2,3,4 s1 0 1 ...

「妖精」團隊 阿里巴巴

6年 這個正迅速擴張的團隊仍超乎尋常地保持著 亢奮 和 戰鬥欲 有人質疑這是 精神控制術 而阿里巴巴決定在新年將塑造團隊的種種魔力 制度化 成為其 基本法 在以 白娘子傳奇 聞名的江南杭城,坐落著兩個氣質與這座城市極不搭調的樓層。15天前,這個富有 攻擊性 的空間 迫使全球最有影響力的女人之一,eb...