题意
题解
DP
对区间按左界排序,以保证处理每一个区间时左界比其左界小的区间已经被处理。
d
p
[
i
+
1
]
[
j
]
dp[i+1][j]
dp[i+1][j] 代表使用索引为
[
0
,
i
]
[0,i]
[0,i] 的使视频覆盖区间
[
0
,
j
]
[0,j]
[0,j] 的最小数量,假设视频
i
i
i 覆盖区间为
[
l
b
[
i
]
,
u
b
[
i
]
]
[lb[i], ub[i]]
[lb[i],ub[i]],则有
d
p
[
i
+
1
]
[
j
]
=
m
i
n
{
d
p
[
i
]
[
l
b
[
i
]
]
+
1
}
dp[i+1][j]=min\{dp[i][lb[i]]+1\}
dp[i+1][j]=min{dp[i][lb[i]]+1} 实现上可以压缩为一维
D
P
DP
DP。
class Solution
{
#define maxn 101
#define inf 0x3f3f3f3f
public:
int dp[maxn];
int videoStitching(vector<vector<int>> &clips, int T)
{
int n = clips.size();
sort(clips.begin(), clips.end());
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for (int i = 0; i < n; ++i)
{
auto &cp = clips[i];
if (dp[cp[0]] == inf)
break;
int m = dp[cp[0]];
for (int j = cp[0]; j <= cp[1]; ++j)
{
dp[j] = min(dp[j], m + 1);
}
}
return dp[T] == inf ? -1 : dp[T];
}
};
贪心
每次拓展区间,贪心地拓展至可能的最远右界。那么每次维护当前一步可以达到的最远右界,用左界为区间内点的电影片段右界更新下一步可以达到的最远右界。
class Solution
{
#define maxn 101
public:
int ub[maxn];
int videoStitching(vector<vector<int>> &clips, int T)
{
int n = clips.size();
for (auto cp : clips)
{
ub[cp[0]] = max(ub[cp[0]], cp[1]);
}
int res = 0, cur = 0, nxt = 0;
for (int i = 0; i < T; ++i)
{
nxt = max(nxt, ub[i]);
if (i == cur)
++res, cur = nxt;
if (i == nxt)
return -1;
}
return res;
}
};