#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100];
int dp[100];
int shangsheng(int begin,int end)
{
memset(dp, 0, 100 * sizeof(int));
int ans = 0;
for (int i = begin;i < end;i++)
{
dp[i] = 1;
for (int j = 0;j < i;j++)
if (a[j] < a[i])dp[i] = max(dp[j] + 1, dp[i]);
ans = max(ans, dp[i]);
}
return ans;
}
int xiajiang(int begin,int end)
{
memset(dp, 0, 100 * sizeof(int));
int ans = 0;
for (int i = begin;i < end;i++)
{
dp[i] = 1;
for (int j = 0;j < i;j++)
if (a[j] > a[i])dp[i] = max(dp[j] + 1, dp[i]);
ans = max(ans, dp[i]);
}
return ans;
}
int main()
{
int n;
cin >> n;
int ans = 0;
for (int i = 0;i < n;i++)cin >> a[i];
for (int i = 0;i < n ;i++)
{
ans = max(ans, shangsheng(0, i) + xiajiang(i, n));
}
cout << n - ans;
return 0;
#include<iostream>
#include<algorithm>
using namespace std;
int a[100];
int dp[100];
int shangsheng(int begin,int end)
{
memset(dp, 0, 100 * sizeof(int));
int ans = 0;
for (int i = begin;i < end;i++)
{
dp[i] = 1;
for (int j = 0;j < i;j++)
if (a[j] < a[i])dp[i] = max(dp[j] + 1, dp[i]);
ans = max(ans, dp[i]);
}
return ans;
}
int xiajiang(int begin,int end)
{
memset(dp, 0, 100 * sizeof(int));
int ans = 0;
for (int i = begin;i < end;i++)
{
dp[i] = 1;
for (int j = 0;j < i;j++)
if (a[j] > a[i])dp[i] = max(dp[j] + 1, dp[i]);
ans = max(ans, dp[i]);
}
return ans;
}
int main()
{
int n;
cin >> n;
int ans = 0;
for (int i = 0;i < n;i++)cin >> a[i];
for (int i = 0;i < n ;i++)
{
ans = max(ans, shangsheng(0, i) + xiajiang(i, n));
}
cout << n - ans;
return 0;
}
自己写的,本想最后cout<<n-ans+1 但不知道为什么+1就错了,不加1ac了,这道题梦游ac
突然明白了,第一个上升子序列的区间是[0,i) 而下降的是[i,n) 合并起来正好就是原来的串