#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> tab;
int licz(vector<int> V){
vector<int> dp[3];
for(int i=0; i<3; i++)dp[i].resize(n);
dp[0][0] = 0;//niezmieniam
dp[1][0] = 1;//daje nanajmniejsze
dp[2][0] = 1;//daje najwieksze
for(int i=1; i<n; i++){
if(i%2==1){ //pierwszy jest maly
if(tab[i-1] < tab[i]){
dp[0][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) );
}else{
dp[0][i] = dp[1][i-1];
}
dp[1][i] = dp[1][i-1] + 1;
dp[2][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) ) + 1;
}
if(i%2==0){
if(tab[i-1] > tab[i]){
dp[0][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) );
}else{
dp[0][i] = dp[2][i-1];
}
dp[2][i] = dp[2][i-1] + 1;
dp[1][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) ) + 1;
}
}
/*for(int i=0; i<n; i++){
for(int j=0; j<3; j++)cout<<dp[j][i]<<" ";
cout<<endl;
}*/
return min(dp[0][n-1], min( dp[1][n-1], dp[2][n-1] ) );
}
int main(){
cin>>n;
tab.resize(n);
for(auto &x : tab)cin>>x;
int wynik = licz(tab);
for(auto &x : tab)x = 2e6 - x;
cout<<min( wynik, licz(tab));
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include<bits/stdc++.h> using namespace std; int n; vector<int> tab; int licz(vector<int> V){ vector<int> dp[3]; for(int i=0; i<3; i++)dp[i].resize(n); dp[0][0] = 0;//niezmieniam dp[1][0] = 1;//daje nanajmniejsze dp[2][0] = 1;//daje najwieksze for(int i=1; i<n; i++){ if(i%2==1){ //pierwszy jest maly if(tab[i-1] < tab[i]){ dp[0][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) ); }else{ dp[0][i] = dp[1][i-1]; } dp[1][i] = dp[1][i-1] + 1; dp[2][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) ) + 1; } if(i%2==0){ if(tab[i-1] > tab[i]){ dp[0][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) ); }else{ dp[0][i] = dp[2][i-1]; } dp[2][i] = dp[2][i-1] + 1; dp[1][i] = min( dp[0][i-1], min( dp[1][i-1], dp[2][i-1] ) ) + 1; } } /*for(int i=0; i<n; i++){ for(int j=0; j<3; j++)cout<<dp[j][i]<<" "; cout<<endl; }*/ return min(dp[0][n-1], min( dp[1][n-1], dp[2][n-1] ) ); } int main(){ cin>>n; tab.resize(n); for(auto &x : tab)cin>>x; int wynik = licz(tab); for(auto &x : tab)x = 2e6 - x; cout<<min( wynik, licz(tab)); } |
English