動態規劃 區間

2021-10-23 16:30:27 字數 1569 閱讀 1344

真是乙個思維巧妙的毒瘤題。

因此我們直接利用上面的性質來dp.

設f [i

][j]

f[i][j]

f[i][j

]表示線段按右端點排序後第i

ii條,[j,

rj

][j,r_j]

[j,rj​

]只被覆蓋了一次的最小代價,[1,

rj

][1,r_j]

[1,rj​

]全部被覆蓋的方案數。那麼,我們需要根據上乙個線段j

jj和i

ii的位置關係來進行轉移。

這樣,我們可以用求字首最小值方法來實現o(n

(n+m

))

o(n(n+m))

o(n(n+

m))的轉移。

那麼有乙個問題,這樣轉移都會把所有的狀態都轉移到嗎?

例如狀態的第二維l

il_i

li​和rj+

1r_j+1

rj​+

1來說,如果需要的狀態大於這個數字,那麼可以在字首最小值的時候列舉到;如果小於這個數字,接下來的數字還能列舉到jjj。

#include

using namespace std;

const

int n =

3000

;int n, m, res;

int f[n]

[n], min[n]

[n];

struct node a[n]

;int

read

(void

)bool pig

(node p1, node p2)

void

work

(void

) res =

1e9;

sort

(a+1

, a+n+

1, pig)

;for

(int i=

1;i<=n;

++i)

for(

int j=

1;j<=m;

++j)

f[i]

[j]= min[i]

[j]=

1e9;

for(

int i=

1;i<=n;

++i)

min[i][1

]= f[i][1

];for(

int j=

2;j<=a[i]

.r;++j) min[i]

[j]=

min(min[i]

[j-1

], f[i]

[j]);if

(a[i]

.r == m) res =

min(res, min[i]

[m]);}

cout <<

(res ==

1e9?-1

: res)

<< endl;

return;}

intmain

(void

)

動態規劃 區間型

概述 最長的回文序列 取數是否必勝 給定乙個序列 字串,進行一些操作,最後一步會將序列 字串去頭 去尾 剩下的會是乙個區間 i,j 狀態自然定義為f i j 表示面對子串行 i,j 時的最優性質 1.題目描述 1.給定乙個字串s,長度是n,找到它最長的回文子串行的長度 例子 輸入 bbbab 輸出 ...

模板 動態規劃 區間dp

因為昨天在codeforces上設計的區間dp錯了 錯過了上紫的機會 覺得很難受。看看學長好像也有學,就不用看別的神犇的了。區間dp處理環的時候可以把序列延長一倍。for int len 1 len n len 首先,使用四邊形優化要滿足下面的性質 當小區間包含在大區間中,則小區間的成本不高於大區間...

動態規劃 區間DP 計數類DP

acwing 282.石子合併 區間dp的特點是狀態表示的時候表示的是某乙個區間的情況 動態規劃模型分析 即 不管石子如何合併,最後一步的操作一定是將兩堆石子合併 把步驟回到倒數第一步。當在做最後一次操作時遍歷所有區間,將最後一步最小的情況記錄進f陣列裡 部分如下 全域性變數 const int n...