E. Block Sequence

https://codeforces.com/problemset/problem/1881/E

题意:给定一个长度为n的整数数组a,现问执行至少多少次删除元素操作可以让beautiful。 beautiful:a可以分成若干个块,块的第一个数字代表块的从第二个数字起到结尾的长度。

思路:动态规划,从后往前考虑,当前的位置i有两种情况,第一种是删除i,第二种是以i作为块的第一个元素,dp[i] = dp[i - 1] + 1或dp[i] = dp[i + a[i] + 1],所以可以想到初始条件dp[n] = 0, dp[n - 1] = 1,从后往前一次遍历即可。

总结:暴力破解的思路应该是从前往后递归,然后依次让当前的下标i走这样几个分支:作为前一个元素的块内元素,作为起始元素,删除该元素,然后再加一些剪枝进去就行了,时间复杂度太高了。而dp,如果从前往后考虑,很难确定当前的下标是作为块内元素,还是说作为起始元素,感觉找不到转移的规律。凌乱~~

inline void solve() {
	int n;
	cin >> n;

	vector<int> a(n);
	for (auto& x : a) {
		cin >> x;
	}

	vector<int> dp(n + 1, INF);
	dp[n] = 0;
	dp[n - 1] = 1;
	for (int i = n - 2; i >= 0; --i) {
		int p = i + a[i] + 1;
		dp[i] = dp[i + 1] + 1;
		if (p <= n) {
			dp[i] = min(dp[i], dp[p]);
		}
	}

	cout << dp[0] << '\n';
}
posted @ 2025-04-09 10:24  _Yxc  阅读(12)  评论(0)    收藏  举报