七彩線段 裝壓dp 牛客網

2022-06-27 03:09:09 字數 1295 閱讀 3772

題目描述

聽說彩虹有七種顏色?

一維座標軸上n條線段,每條線段左端點l,右端點r,顏色為c,從中選m種顏色的互不接觸的線段,每種顏色可選多條,所選線段的總長度最長為多少?

輸入描述:

第一行2個整數 n, m;

接下來n行,每行3個整數l, r, c。

輸出描述:

乙個整數,表示所選線段的最長的總長度;若選不了,輸出-1;

示例1輸入

複製4 2

1 3 1

4 5 1

5 8 2

7 9 3

輸出複製

5示例2

輸入複製

4 31 3 1

4 5 1

5 8 2

7 9 3

輸出複製

-1備註:

1 <= n <= 100000; 1 <= m <= 7;

1 <= l < r <= 1000000000; 1 <= c <= 7;

題意 : 在一維平面上給你 n 條線段,每條線段都有乙個顏色,你可以在其中選出任意條線段,但任意兩條均不能相交,且顏色數應恰好等於 m, 問你可以選取的最大長度是多少

思路分析 :觀察發現顏色數 <= 7, 因此比較容易想到裝壓 dp,定義 dp[i][j] 表示到 i 條線段時,此時狀態為 j 的最大長度

顯然根據這個可以去遞推 dp[i][j|(1<<(arr[i].c-1))] = max(dp[i][j|(1<<(arr[i].c-1))], dp[pos][j]+arr[i].r-arr[i].l) 

最後再數一下狀態中 1 的個數剛好等於 m 的即可

**示例 :

#define ll long long

const ll maxn = 2e5+5;

ll n, m;

struct node

}arr[maxn];

vectorve;

ll dp[maxn][150];

ll bitnum[150];

void init()

void solve()

if (bitnum[j] == m) ans = max(ans, dp[i][j]); }}

printf("%lld\n", ans);

}int main()

sort(arr+1, arr+1+n);

for(ll i = 1; i <= n; i++) ve.push_back(arr[i].r);

solve();

return 0;

}

牛客 膜法記錄 狀壓dp預處理

題目大意 給出乙個 n m 的矩陣,其中存在著些許敵人,現在可以進行 a 次行攻擊,以及 b 次列攻擊,顧名思義,每次行攻擊可以消滅一整行的敵人,每次列攻擊可以消滅一整列的敵人,現在問能否通過合適的搭配,使得敵人全部消滅 題目分析 因為 n 最大只有20,所以考慮狀態壓縮預處理,對於每一列來說,所有...

狀壓DP 牛客練習賽57C 裝貨物

開二維肯定會爆記憶體了,箱子只有21個,我們考慮用狀壓dp來做。並且開兩個一維的。乙個代表為i狀態至少需要用多少個箱子,乙個表示用到第m個箱子的時候我們當前箱子剩餘的最大容量。分兩種情況轉移 1,我們當前的這個箱子剩餘容量夠裝,並且我們上一次裝了這個物品所用的箱子的狀態大於目前能裝且不用多餘箱子的狀...

2019牛客多校第七場H Pair 數字DP

題意 給你乙個3個數a,b,c問有多少對pair i,j 1 i a,1 j b,i and j c或 i xor j c。a,b,c範圍為1e9.思路 場上一看以為是推式子加什麼篩做,無果。之後才知道是數字dp 以下思路來自學長的 orz 首先,我們可以把問題轉化為求i and j c並且 i x...