動態規劃 NKOJ 4250 小區劃分

2021-08-09 01:39:49 字數 1259 閱讀 6518

問題描述

一條街道的兩側各連續坐落著 n 座單元樓。現在要為這些單元樓劃分居民校區。

規則如下:

每個小區只能由同一側連續的若干座單元樓組成。且兩側都恰有 k 個小區(每個小區至少有一棟樓)。

兩側的小區劃分規則應該相同,比如,若左邊的房子被分成 , 這兩個小區,那麼右邊也應該如此。

這樣兩邊合計一共有 k 對小區。

用 ai,bii​​,b​i​​ 表示左右兩邊每座樓的人口在同側所有單元樓總人口中所佔的百分比,定義乙個小區的相對擁擠程度為其人口百分比之和(左邊就是對應 aia_ia​i​​ 的和,右邊是對應 bib_ib​i​​ 的和)。定義這條街道的總擁擠程度為左右兩邊 kkk 對小區的相對擁擠程度之差的絕對值之和。

現在,請你求出可能的最大擁擠程度。

輸入格式

第一行兩個整數 n 和 k。

第二行 n 個實數,第 i 個數為 ai​i​​。

第三行 n 個實數,第 i 個數字 bi​i​​。

輸出格式

乙個實數,表示這條街道的最大相對擁擠程度,保留到小數點後六位。

樣例輸入

3 20.1 0.75 0.15

0.4 0.3 0.3

樣例輸出

0.600000

題解:

本題是一道典型的動態規劃。

用f[i,j]表示兩邊的前i座樓中,被分為j段的情況下,最大可能的擁擠程度之差。

轉移方程為f[i,j]=max )-py()|}

其中px和py分別表示將兩邊大樓劃分出(l,i]這段作為小區的擁擠程度之和。

再注意一下邊界條件即可。

#include#include#include#include#define maxn 1000

#define maxm 100

using namespace std;

double a[maxn],b[maxn],dp[maxn][maxm];

int n,k;

double gf_abs(double x)

void get_ans()

} }}void init()

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

void solve()

int main()

動態規劃之小鑫去爬山

time limit 1000ms memory limit 65536kb submit statistic problem description 馬上就要放假了,小鑫打算去爬山。第i個區間有i個落腳點,每乙個落腳點都有乙個危險值。小鑫需要在第n個海拔區間挑選乙個點向上爬,爬到第1個海拔區間 也...

程式設計題 小Q的歌單(動態規劃)

輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個整數,表示歌單的總長度k 1 k 1000 接下來的一行包含四個正整數,分別表示歌的第一種長度a a 10 和數量x x 100 以及歌的第二種長度b b 10 和數量y y 100 保證a不等於b。輸出描述 輸出乙個整數,表示組成歌單...

動態規劃(洛谷1373 小a和uim之大逃離)

瞬間,地面上出現了乙個n m的巨幅矩陣,矩陣的每個格仔上有一坨0 k不等量的魔液。怪物各給了小a和uim乙個魔瓶,說道,你們可以從矩陣的任乙個格仔開始,每次向右或向下走一步,從任乙個格仔結束。開始時小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,並且要求最後一步必須由uim吸收。魔瓶只...