計蒜客-刪除最少的元素(動態規劃)
阿新 • • 發佈:2019-02-03
#include <stdio.h> #include <stdlib.h> int countDeletedElements(int *nums, int length) { //len1和len2分別為從左向右求最長遞減序列長度和從右向左求最長遞減序列長度 //可以得到ans = length - max(1<=i<=length){len1+len2} int len1[length+10], len2[length+10]; for(int i = 0; i <= length; i++){ len1[i] = 0; len2[i] = 0; } len1[0] = 1; for(int i = 1; i < length; i++){ int tmp = 0; for(int j = 0; j < i; j++){ if(nums[i] <= nums[j] && len1[j] > tmp) tmp = len1[j]; } len1[i] = tmp + 1; } len2[length-1] = 1; for(int i = length-2; i >= 0; i--){ int tmp = 0; for(int j = length-1; j > i; j--){ if(nums[i] <= nums[j] && len2[j] > tmp) tmp = len2[j]; } len2[i] = tmp + 1; } //注意因為len1和len2是逆序的,所以是len1[i]+len2[i] int ans = 0, tmp = 0; for(int i = 0; i < length; i++) if(len1[i]+len2[i] > tmp) tmp = len1[i]+len2[i]; ans = length - (tmp-1); return ans; } int main() { int n; scanf("%d", &n); int *a = malloc(sizeof(int) * n); for (int i = 0; i < n; ++i) { scanf("%d", &a[i]); } printf("%d\n", countDeletedElements(a, n)); return 0; }