PTA山峰形状
一、题目描述
二、解题思路
这题其实就是枚举每个位置,然后根据这个位置判断需要剔除几个人,反向思考,我们需要剔除几个人。
pos之前的部分做一个最长递增子序列的dp,用前面的总人数减去最长递增就是前面部分需要剔除几个人
pos之后的部分做一个最长递减子序列的dp,用前面的总人数减去最长递减就是后面部分需要剔除几个人
然后比较一下,最小剔除人数,记录位置就可以了
三、代码实现
1 #include "bits/stdc++.h" 2 #define PII pair<int,int> 3 #define rep(i,z,n) for(int i = z;i <= n; i++) 4 #define per(i,n,z) for(int i = n;i >= z; i--) 5 #define ll long long 6 #define db double 7 #define vi vector<int> 8 #define debug(x) cerr << "!!!" << x << endl; 9 using namespace std; 10 //从某个串中把某个子串替换成另一个子串 11 string& replace_all(string& src, const string& old_value, const string& new_value) { 12 // 每次重新定位起始位置,防止上轮替换后的字符串形成新的old_value 13 for (string::size_type pos(0); pos != string::npos; pos += new_value.length()) { 14 if ((pos = src.find(old_value, pos)) != string::npos) { 15 src.replace(pos, old_value.length(), new_value); 16 } 17 else break; 18 } 19 return src; 20 } 21 inline ll read() 22 { 23 ll s,r; 24 r = 1; 25 s = 0; 26 char ch = getchar(); 27 while(ch < '0' || ch > '9'){ 28 if(ch == '-') 29 r = -1; 30 ch = getchar(); 31 } 32 while(ch >= '0' && ch <= '9'){ 33 s = (s << 1) + (s << 3) + (ch ^ 48); 34 ch = getchar(); 35 } 36 return s * r; 37 } 38 inline void write(ll x) 39 { 40 if(x < 0) putchar('-'),x = -x; 41 if(x > 9) write(x / 10); 42 putchar(x % 10 + '0'); 43 } 44 int a[110]; 45 int n; 46 int solve(int pos) 47 { 48 int ans = 0; 49 int dp1[110]; 50 int dp2[110]; 51 // cout << pos << ','; 52 for(int i = 1;i <= n;i++) 53 dp1[i] = dp2[i] = 1; 54 for(int i = 1;i < pos;i++) 55 for(int j = i + 1;j <= pos;j++) 56 if(a[j] > a[i]) 57 dp1[j] = max(dp1[j],dp1[i] + 1); 58 int mx = -INT_MAX; 59 for(int i = 1;i <= pos;i++) 60 mx = max(mx,dp1[i]); 61 ans += pos - mx; 62 // cout << mx << ' ,'; 63 for(int i = pos;i < n;i++) 64 for(int j = i + 1;j <= n;j++) 65 if(a[j] < a[i]) 66 dp2[j] = max(dp2[j],dp2[i] + 1); 67 mx = -INT_MAX; 68 for(int i = pos;i <= n;i++) 69 mx = max(dp2[i],mx); 70 // cout << mx << endl; 71 ans += (n - pos + 1) - mx; 72 return ans; 73 } 74 int main() 75 { 76 77 n = read(); 78 rep(i,1,n) 79 cin >> a[i]; 80 int ans = INT_MAX; 81 rep(i,1,n){ 82 if(ans > solve(i)) 83 ans = solve(i); 84 } 85 cout << ans; 86 return 0; 87 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}