#include<bits/stdc++.h>
#define INF 0x3fffffff
#define endl '\n'
using namespace std;
void solve() {
int n;cin >> n;
vector<int> dp(n+1);
vector<int> nums(2,INF);
int x;
for(int i = 1;i<=n;i++) {
cin >> x;
dp[i] = nums[x]+1;
nums[x] = min(nums[x],dp[i-1]);
}
if(dp[n] > n) cout << -1 << endl;
else cout << dp[n] << endl;
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int t = 1;
while(t--) {
solve();
}
return 0;
}
看了一下别人的解析,还有比较思维的做法?
动态规划还是很好看出来的,每次往队尾添加新元素时,必须保证新元素可以旧元素匹配,否则就是-1,同时贪心选择最小的旧元素就好了

京公网安备 11010502036488号