3 solutions
-
0
事已至此,不如一起愉快地dp
#include <bits/stdc++.h> #define int long long #define QAQ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define endl '\n' using namespace std; const int N=2e5+5,M=1e6+5; int n,min_i,min_ai,minn=1e9; int a[N],dp[N],b[M],c[M];//dp走到第i个格子最小步数 b标记数量 c标记上一个位置 signed main() {//1.来自左边+1 2.来自上一个相同的+1 3.来自右边+1 QAQ; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; dp[1]=0; minn=dp[1],min_i=1,min_ai=a[1]; b[a[1]]=1,c[a[1]]=1; for(int i=2;i<=n;i++) { if(b[a[i]]>=1)//存在上一个 { if(dp[i-1]>dp[c[a[i]]])//来自上一个 { dp[i]=dp[c[a[i]]]+1; int num=i; while(dp[num-1]>dp[num]+1)//往前更新 { dp[num-1]=dp[num]+1; num--; } } else dp[i]=dp[i-1]+1;//来自左 } else dp[i]=dp[i-1]+1;//来自左 b[a[i]]++; c[a[i]]=i; } cout<<dp[n]; return 0; }
Information
- ID
- 7012
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- (None)
- # Submissions
- 149
- Accepted
- 12
- Uploaded By