题目1500:出操队形
2013-08-15 10:45
148 查看
/* 题意 : 对于一个序列,开始严格上升,然后严格下降的最长的长度 就是最长上升子序列的变形,对于i,(从左从右)求两次上升子序列的最长长度 ,寻找到最长的长度 */ #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int MAX = 1000000+10; int left_l[MAX],right_r[MAX]; int arr[MAX]; vector <int> vt; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&arr[i]); } vt.clear(); for(int i=0;i<n;i++) { if(vt.empty() || vt.back()<arr[i]) vt.push_back(arr[i]); else { int pt=lower_bound(vt.begin(), vt.end(), arr[i])-vt.begin(); vt[pt]=arr[i]; } left_l[i]=vt.size(); } vt.clear(); for(int i=n-1;i>=0;i--) { if(vt.empty() || vt.back()<arr[i]) vt.push_back(arr[i]); else { int pt=lower_bound(vt.begin(), vt.end(), arr[i])-vt.begin(); vt[pt]=arr[i]; } right_r[i]=vt.size(); } /* for( i=0;i<n;i++) printf("%d ",left_l[i]); printf("\n"); for( i=0;i<n;i++) printf("%d ",right_r[i]); printf("\n"); */ int ans=0; for(int i=0;i<n;i++) { if(left_l[i]+right_r[i]>ans) ans= left_l[i]+right_r[i]; } printf("%d\n",n-ans+1); } return 0; }
相关文章推荐
- [Jobdu] 题目1500:出操队形
- 九度 题目1500:出操队形
- 题目1500:出操队形
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
- 九度 1500:出操队形(LIS变形)
- 九度OJ 题目1131:合唱队形
- 题目1131:合唱队形
- 九度 oj 题目1131:合唱队形
- 九度题目1131:合唱队形
- HDOJ 题目4512 吉哥系列故事——完美队形I(LICS变形)
- 【最长降序子序列+双向】九度OJ 题目1131:合唱队形
- 出操队形(LIS)
- 使用java实现LIS算法,出操队形的问题
- 题目1131:合唱队形
- 题目1131:合唱队形
- 题目1131:合唱队形
- 题目1131:合唱队形
- 题目1131:合唱队形
- 题目1131:合唱队形(最长递增子序列进阶)