题目大意:
http://codevs.cn/problem/1058/
求每一个点的之前的最长上升子序列和每一个点的之后的最长下降子序列。
之前报错,因为需要将每一个dp的值赋值为1.
代码:
#include <iostream> #include <cstring> using namespace std; int arr[1000] = {0}; int n; int main() { cin >> n; for(int i = 0; i < n; i++) { cin >> arr[i]; } int dp[1000],dp1[1000]; for(int i = 0; i < 1000; i++) dp[i] = dp1[i] = 1; for(int i = 1 ; i < n; i++) { for(int j = 0; j < i; j++) { if(arr[i] > arr[j]) dp[i] = max(dp[i],dp[j]+1); } } for(int i = n - 2 ; i >= 0; i--) { for(int j = i + 1; j < n; j++) { if(arr[i] > arr[j]) dp1[i] = max(dp1[i],dp1[j]+1); } } int max = 0; for(int i = 0; i < n; i++) { if(dp[i]+dp1[i]-1 > max) max = dp[i]+dp1[i]-1; } cout << n - max << endl; return 0; }