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';
}

浙公网安备 33010602011771号