HRBUST 2010【簡單dp+最長遞減子序列】
阿新 • • 發佈:2018-05-01
amp stdio.h 遞增 scan ace name 多少 scanf ring
題目:所謂二等隊形就是從大到小依次排列,即對於數列a,二等隊形為任意a【i】滿足:a【i】>a【i+1】。現在給出一個長度為n的數列,從中最少去除多少個數可使數列變成二等隊形數列。
做法和遞增的沒啥差別
#include<stdio.h> #include<string.h> #include<queue> #include<cmath> #define MAX 1000+10 #define INF 0x3f3f3f3f int n; int dp[MAX]; using namespace std; int main(void) { int a[MAX]; while (~scanf("%d", &n)) { for (int i = 1; i <= n; i++) dp[i] = 1; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); a[0] = INF; dp[0] = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j < i; j++) { if (a[i] < a[j]) { dp[i] = max(dp[j] + 1, dp[i]); } } } int maxx = -INF; for (int i = 1; i <= n; i++) { maxx = max(dp[i], maxx); } printf("%d\n", n - maxx); } return 0; }
HRBUST 2010【簡單dp+最長遞減子序列】