Description
Input
Output
Sample Input
8
1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Output
4
题意是让抽出一些士兵 使剩下的士兵成三角分布
先从左到右求最长单调递减子序列 再从右向左求最长单调递减子序列
然后枚举起始点 有两个 n-l_dp[i]-r_dp[j] 即为需要去除的最小人数
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; int n; double a[1010]; int r_dp[1010]; int l_dp[1010]; void Rsub() { for (int i = n; i >= 1; i--) { r_dp[i] = 1; for (int j = n; j > i; j--) { if (a[i] > a[j]) r_dp[i] = max(r_dp[i], r_dp[j]+1); } } } void Lsub() { for (int i = 1; i <= n; i++) { l_dp[i] = 1; for (int j = 1; j < i; j++) { if (a[i] > a[j]) l_dp[i] = max(l_dp[i], l_dp[j]+1); } } } int main() { //freopen("1.txt", "r", stdin); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%lf", &a[i]); } Rsub(); Lsub(); int ans = 1100; for (int i = 1; i <= n; i++) { for (int j = i+1; j <= n; j++) ans = min(ans, n-l_dp[i]-r_dp[j]); } printf("%d\n", ans); return 0; }
原文:http://www.cnblogs.com/whileskies/p/7243305.html