Advertisement
Guest User

Portali

a guest
Feb 24th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<cmath>
  4. using namespace std;
  5. typedef long long ll;
  6. int main()
  7. {
  8.     int n;
  9.     cin>>n;
  10.     int m;
  11.     cin>>m;
  12.     vector<int> v;
  13.     for(int i=0;i<n;i++)
  14.     {
  15.         int a;
  16.         cin>>a;
  17.         v.push_back(a);
  18.     }
  19.     vector<int> dp(n+1,1e9);
  20.     vector<int> visi(11,0);
  21.     dp[0]=0;
  22.     for(int i=0;i<n;i++)
  23.     {
  24.         int broj=v[i];
  25.         if(visi[broj])
  26.             continue;
  27.             int maxi=1e9;
  28.             int index=-1;
  29.             for(int j=0;j<n;j++)
  30.             {
  31.                 if(j>0)
  32.                     dp[j]=min(dp[j],dp[j-1]+1);
  33.                 if(j<n-1)
  34.                     dp[j]=min(dp[j],dp[j+1]+1);
  35.                 if(v[j]==broj)
  36.                 {
  37.                     if(dp[j]<maxi)
  38.                     {
  39.                         maxi=dp[j];
  40.                         index=j;
  41.                     }
  42.                 }
  43.             }
  44.             for(int j=n-1;j>=0;j--)
  45.             {
  46.                 if(j>0)
  47.                     dp[j]=min(dp[j],dp[j-1]+1);
  48.                 if(j<n-1)
  49.                     dp[j]=min(dp[j],dp[j+1]+1);
  50.    
  51.                 if(v[j]==broj)
  52.                 {
  53.                     if(dp[j]<maxi)
  54.                     {
  55.                         maxi=dp[j];
  56.                         index=j;
  57.                     }
  58.                 }
  59.             }
  60.         for(int j=0;j<n;j++)
  61.         {
  62.             if(abs(j-index)<=m&&v[j]==broj)
  63.                 dp[j]=min(dp[j],maxi+(int)abs(j-index));
  64.             else if(v[j]==broj)
  65.                 dp[j]=min(maxi+m,dp[j]);
  66.             if(j+1<n)
  67.                 dp[j+1]=min(dp[j+1],dp[j]+1);
  68.             if(j-1>=0)
  69.                 dp[j-1]=min(dp[j-1],dp[j]+1);
  70.         }
  71.         visi[broj]=true;
  72.     }
  73.    
  74.     cout<<dp[n-1]<<endl;
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement