首先可以dp做,把資料離散化後dp[i]表示到i位置的最多區間數。
把所有區間按照右端點排序從左往右排序,求dp[i]就用右端點為i的區間更新答案。
狀態轉移可以看**。
這種做法常數較大,我們還可以用貪心解此題。
我們依舊按照右端點排序,從左往右列舉所有區間,如果當前區間與前面沒有重疊(即此區間的左端點在前面選擇的區間右端點的右面),就選上這個區間。
感性證明:
能選一定要選,答案+1;
若與前面的有重疊,那麼選上這個一定使》=1個區間不能選,而且這個區間的右端點靠右,對後面的區間不利,所以不選。
(貪心**太簡單這裡只放dp)(其實是懶)
1 #include2 #include3 #include4 #include5 #include6using
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 ...