洛谷 T150188 區間(貪心,dp)

2022-02-13 12:52:37 字數 956 閱讀 4106

首先可以dp做,把資料離散化後dp[i]表示到i位置的最多區間數。

把所有區間按照右端點排序從左往右排序,求dp[i]就用右端點為i的區間更新答案。

狀態轉移可以看**。

這種做法常數較大,我們還可以用貪心解此題。

我們依舊按照右端點排序,從左往右列舉所有區間,如果當前區間與前面沒有重疊(即此區間的左端點在前面選擇的區間右端點的右面),就選上這個區間。

感性證明:

能選一定要選,答案+1;

若與前面的有重疊,那麼選上這個一定使》=1個區間不能選,而且這個區間的右端點靠右,對後面的區間不利,所以不選。

(貪心**太簡單這裡只放dp)(其實是懶)

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=1000005;8

int n,d[2*maxn],len,dp[2*maxn],cnt;

9struct

nodeq[maxn];

12bool

cmp(node a,node b)

15int

main()

22 sort(d+1,d+2*n+1

);23 sort(q+1,q+n+1

,cmp);

24 len=unique(d+1,d+2*n+1)-d-1;25

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

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

34 dp[cnt]=max(dp[cnt],dp[q[i].l]+1

);35

}36 printf("%d"

,dp[q[n].r]);

37return0;

38 }

洛谷p1603 區間dp

區間dp 在區間上進行動態規劃,求解一段區間上的最優解。主要是通過合併小區間的 最優解進而得出整個大區間上最優解的dp演算法。核心思路 思路 求解在乙個區間上的最優解,那麼把這個區間分割成乙個個小區間,求解每個小區間的最優解,再合併小區間得到大區間即可。所以可以列舉區間長度len 為每次分割成的小區...

洛谷 P1712 區間

在數軸上有 n個閉區間 l1,r1 l2,r2 ln,rn 現在要從中選出 m 個區間,使得這 m個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 x,使得對於每乙個被選中的區間 li,ri 都有 li x ri。對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最短區間長度。...

洛谷1880 區間dp 記憶化搜尋 合併石子

題目 題意是 給定乙個序列,最小規則是相鄰兩個值的合併,開銷是他們的和,將整個序列合併成乙個值的情況下,求解該值的最小值和最大值。如下 1 include2 using namespace std 3 typedef unsigned int ui 4 typedef long long ll 5 ...