其他
算法面试题:草坪修整
The following article is from 小K算法 Author 小K算法
如若转载请联系原公众号
01故事起源
注:
02分析
很多时候不容易直接求解时,都可以尝试反向思考,这个技巧非常重要。
03最终状态法
04动态规划
设f[i]表示前i个区间中,选择第i个区间作为最后一个区间时的最优解,则f[i]=max(f[j])+1,其中区间j与区间i无重叠。
最大的f[i]就是我们要求的最优解。
05贪心
而贪心并不是计算了所有的情况,它是在每一步都选择一个最优的,从而保证全局也是最优的。
如果按区间终点排序,则选择a比选择b更优,因为从左向右求每一步的最优解时,选择a可以给后面的区间留下更多的空间。同理如果按起点排序,就从右向左扫描求解即可。
bool cmp(const vector<int> &u, const vector<int> &v) {
return u[1] < v[1];
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i][0] >> a[i][1];
}
a.resize(n);
sort(a.begin(), a.end(), cmp);
int ans = 1, right = a[0][1];
for (int i = 1; i < n; ++i) {
if (a[i][0] >= right) {
right = a[i][1];
ans++;
}
}
cout << n - ans << endl;
return 0;
}
06总结
推荐阅读: