Information
- ID
- 7012
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- (None)
- # Submissions
- 149
- Accepted
- 12
- Uploaded By
事已至此,不如一起愉快地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;
}
By signing up a 追梦算法网 universal account, you can submit code and join discussions in all online judging services provided by us.