题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
#include <iostream> #include <bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n) { vector<int> h(n,0), L(n,0), R(n,0); int ans = n; for (int i = 0; i < n; i++) cin >> h[i]; // L[i]表示在i位置,左边最多有多少人严格递减 for (int i = 1; i < n; i++) { int t = 0; for (int j = i-1; j >= 0; j--) { if (h[i] > h[j]) { t = max(t, L[j] + 1); } } L[i] = t; } // R[i]表示在i位置,右边最多有多少人严格递减 for (int i = n-2; i >= 0; i--) { int t = 0; for (int j = i+1; j<n; j++) { if (h[i] > h[j]) { t = max(t, R[j]+1); } } R[i] = t; } // 计算每一个位置,若左右至少有一个人严格递减,那么记录并取最大值 for (int i = 0; i < n; i++) { if (L[i] != 0 && R[i] != 0) ans = min(ans, n-(L[i]+R[i]+1)); } cout << ans << endl; } } // 64 位输出请用 printf("%lld")
平时写代码少,认为动态规划的思路:
① 找一个暴力可求解的方法
② 对暴力方法进行动态规划优化