计蒜客-删除最少的元素(动态规划)

#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;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/81236950