sue的小球 牛客(區間dp)

2021-09-25 17:17:53 字數 1948 閱讀 8598

sue和sandy最近迷上了乙個電腦遊戲,這個遊戲的故事發在美麗神秘並且充滿刺激的大海上,sue有一支輕便小巧的小船。然而,sue的目標並不是當乙個海盜,而是要收集空中漂浮的彩蛋,sue有乙個秘密**,只要她將小船劃到乙個彩蛋的正下方,然後使用秘密**便可以在瞬間收集到這個彩蛋。然而,彩蛋有乙個魅力值,這個魅力值會隨著彩蛋在空中降落的時間而降低,sue要想得到更多的分數,必須盡量在魅力值高的時候收集這個彩蛋,而如果乙個彩蛋掉入海中,它的魅力值將會變成乙個負數,但這並不影響sue的興趣,因為每乙個彩蛋都是不同的,sue希望收集到所有的彩蛋。 然而sandy就沒有sue那麼浪漫了,sandy希望得到盡可能多的分數,為了解決這個問題,他先將這個遊戲抽象成了如下模型: 以sue的初始位置所在水平面作為x軸。 一開始空中有n個彩蛋,對於第i個彩蛋,他的初始位置用整數座標(xi, yi)表示,遊戲開始後,它勻速沿y軸負方向下落,速度為vi單位距離/單位時間。sue的初始位置為(x0, 0),sue可以沿x軸的正方向或負方向移動,sue的移動速度是1單位距離/單位時間,使用秘密**得到乙個彩蛋是瞬間的,得分為當前彩蛋的y座標的千分之一。 現在,sue和sandy請你來幫忙,為了滿足sue和sandy各自的目標,你決定在收集到所有彩蛋的基礎上,得到的分數最高。

第一行為兩個整數n, x0用乙個空格分隔,表示彩蛋個數與sue的初始位置。

第二行為n個整數xi,每兩個數用乙個空格分隔,第i個數表示第i個彩蛋的初始橫座標。

第三行為n個整數yi,每兩個數用乙個空格分隔,第i個數表示第i個彩蛋的初始縱座標。

第四行為n個整數vi,每兩個數用乙個空格分隔,第i個數表示第i個彩蛋勻速沿y軸負方向下落的的速度。

乙個實數,保留三位小數,為收集所有彩蛋的基礎上,可以得到最高的分數。

3 0

-4 -2 2

22 30 26

1 9 8

0.000
資料範圍:

n < = 1000,對於100%的資料。 -10^4 < = xi,yi,vi < = 10^4

一讀完題就感覺像區間dp的題,而且這個題目標著就是區間dp,但是想不出來怎麼向區間dp上推,老想著用類似記憶化搜尋的方法來,後來看了看大佬們的題解看明白了。

我們想啊,這個人在x軸上的移動是連續的,所以當他走過一段路程之後,這個連續區間的彩蛋就被收集了,而接著運動的時候就會擴大(或者反向移動到另一邊再擴大)這個區間。所以這就能從區間dp的角度進行思考了。

然後怎麼確定乙個區間呢,我們將所有的彩蛋按照x的座標進行排序,就可以找出一塊兒連續的區間了。

我們用dp[i][j][0/1]記錄當收集完[i,j]之間的所有彩蛋後停在左/右邊的最大收集價值。當我們擴大遍歷到的區間的時候,已經被收集的彩蛋價值不改變,減少還未被收集到的彩蛋的價值。因為未被收集的彩蛋也是個連續的區間,所以我們用字首和陣列處理一下,就可以進行o(1)的查詢了。然後收集完乙個區間都可以看作是上乙個區間的擴充套件,而收集完乙個區間只能停在左邊或者右邊上,到達下乙個點的時間就是兩點之間距離。

#include

using

namespace std;

struct node

}a[1010];

int n,x0;

int sum[

1010];

int dp[

1010][

1010][

2];int

main()

for(

int l =

2;l<=n;l++)}

// for(int i = 1;i<=n;i++)

// putchar('\n');

// }

printf

("%.3lf\n"

,max

(dp[1]

[n][0]

,dp[1]

[n][1]

)/1000.0);

return0;

}

塗色PAINT 牛客(區間dp,基礎)

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...

SDOI2008 Sue的小球 題解

給了 n 個小球,第 i 個小球在 x i 初始分值為 y i 同時它會以 dfrac texttt 的速度降低。可以降低為負數 從初始位置開始,每個單位時間可以移動 1 單位長度。收集小球不需要時間,求收集所有小球後能獲得的最大分值。首先,可以想到對每個球按位置從小到大排序。由於總的得分固定,我們...

牛客 CCA的區間 dp 補集轉移

傳送門 首先翻轉乙個區間意味著可以將任意兩段不相交的區間組合,所以問題變成了選兩端不相交的區間,使得合併後區間和最大。那麼我們就處理出來區間,讓後進行轉移即可。設d p i dp i dp i 表示i ii的二進位制子集中的最大值,答案就是i d p ix orba se i dp i xor ba...