真是乙個思維巧妙的毒瘤題。
因此我們直接利用上面的性質來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...