40分,求指出错误
查看原帖
40分,求指出错误
544475
wangjiajian楼主2023/10/2 16:10

动态规划的思想,考虑两个状态:f[i][0]f[i][0] 为另起一串,该点作为开头;f[i][1]f[i][1] 为接上已有的不降的串。

#include <bits/stdc++.h>
#define N (int)(1e6+2)
using namespace std;

int n, l[N], r[N], ans=1;
struct node {
	int pos, len;
} tot, f[N][2];

int main() {
	scanf("%d", &n);
	for(int i=1; i<=n; i++)
		scanf("%d%d", l+i, r+i);
	f[1][0].pos = l[1], f[1][0].len = 1;
	f[1][1].pos = INT_MAX;
	for(int i=2; i<=n; i++) {
		tot.pos = INT_MAX, tot.len = 0;
		if(f[i-1][0].pos <= r[i]) {
			tot.pos = f[i-1][0].pos;
			tot.len = f[i-1][0].len+1;
		}
		if(f[i-1][1].pos <= r[i]) {
			if(f[i-1][1].len+1 > tot.len) {
				tot.pos = f[i-1][1].pos;
				tot.len = f[i-1][1].len+1;
			} else if(f[i-1][1].len+1 == tot.len)
				tot.pos = min(f[i-1][1].pos, tot.pos);
		}
		f[i][0].pos = l[i], f[i][0].len = 1;
		f[i][1].pos = max(tot.pos, l[i]), f[i][1].len = tot.len;
		if(tot.len > ans)
			ans = tot.len;
	}
	printf("%d\n", ans);
	return 0;
}
2023/10/2 16:10
加载中...