计蒜客习题:删除最少的元素
2018-03-03 08:40
232 查看
问题描述
给定有 n 个数的 A 序列:A1,A2,A3…An 。对于这个序列,我们想得到一个子序列 Ap1,Ap2⋯Api⋯Apm(1≤p1< p2<⋯pi<⋯< pm≤n),满足 Ap1≥Ap2≥⋯≥Api≤⋯≤Apm 。从 A 序列最少删除多少元素,可以得到我们想要的子序列。输入格式
第一行输入一个整数 n,代表 A 序列中数字的个数。第二个输入 n 个整数,代表A1,A2 ,A3 …An。(1≤n≤1000,1≤Ai≤10000)
输出格式
输出需要删除的元素个数,占一行。
样例输入
7
3 2 4 1 2 5 3
样例输出
2
AC代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[1010]; int dp2[1010]; int dp1[1010]; int n; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } memset(dp1,0,sizeof(dp1)); for(int i=1;i<=n;i++) {dp1[i]=1; for(int j=1;j<i;j++) { if(a[j]>=a[i])dp1[i]=max(dp1[i],dp1[j]+1); } } memset(dp2,0,sizeof(dp2)); for(int i=n;i>=1;i--) {dp2[i]=1; for(int j=n;j>i;j--) { if(a[j]>=a[i])dp2[i]=max(dp2[i],dp2[j]+1); } } int ans[1010]; for(int i=1;i<=n;i++) { ans[i]=n-(dp1[i]+dp2[i]-1); } int minn=0x3f3f3f3f; for(int i=1;i<=n;i++) { if(minn>ans[i])minn=ans[i]; } cout<<minn; return 0; }
相关文章推荐
- C++ Primer (第四版)课后习题9.26 删除容器元素
- 算法导论Java实现-删除堆中元素HeapDelete(习题6.5-7)
- 【C/C++】C++primer习题9.26中删除元素问题
- C++顺序容器删除元素时的一个小陷阱(C++ primer第四版习题9.26)
- 【最长非上升子序列】删除最少的元素
- 面试题精选(84):使序列有序的最少交换次数(minimum swaps) + 删除序列中所有重复的元素
- [转]Java_List元素的遍历和删除
- JavaScript删除数组里的某个元素
- shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
- PHP从数组中删除元素的四种方法实例
- iterater&nbsp;删除元素的处理方法
- JavaScript HTML DOM 添加和删除节点(HTML 元素)
- js数组依据下标删除元素
- 链表的创建、元素插入、元素删除、以及两个有序链表的归并
- 删除有序链表的重复元素 Remove Duplicates from Sorted List
- [Object C]_[初级]_[两个数组共有元素的提取,删除,数组的合并]
- 在map里删除元素
- 删除单链表中的元素
- leetcode 删除单链表指定元素
- 【Array】数组删除最后一个元素;