从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。 题目描述:
来源:互联网 发布:sql清除挂起工具 编辑:程序博客网 时间:2024/04/28 14:15
#include <iostream>using namespace std;int DoubleEndLIS(int *arr, int len){ int *LIS = new int[len]; int *lefToRight = new int[len]; //leftToRight[i]表示0~i最长子序列长度-1 int *rightToLeft = new int[len]; int maxLen = 0; //记录总共的(上升+下降)最长子序列长度 int low, high, mid; for (int i = 0; i < len; ++i) { lefToRight[i] = 0; LIS[i] = 0; } LIS[0] = arr[0]; for (int i = 1; i < len; i++) { low = 0; high = lefToRight[i-1]; while (low <= high) { mid = (low + high)/2; if (LIS[mid] < arr[i]) { low = mid + 1; } else { high = mid -1; } } LIS[low] = arr[i]; if (low > lefToRight[i-1]) { lefToRight[i] = lefToRight[i-1] + 1; //最长子序列长度加1 } else { lefToRight[i] = lefToRight[i-1]; } } //leftToRight的每个值增加1,因为他们是最长子序列值-1 //此时leftToRight表示的是最长子序列的真正值。 for (int i = 0; i < len; i++) { lefToRight[i]++; } //从右到左 for (int i = 0; i < len; i++) { rightToLeft[i] = 0; LIS[i] = 0; } int k = 0; LIS[0] = arr[len-1]; for (int i = len -2; i >= 0; --i) { low = 0; high = rightToLeft[k]; while (low <= high) { mid = (low + high)/2; if (LIS[mid] < arr[i]) { low = mid + 1; } else { high = mid - 1; } } LIS[low] = arr[i]; if (low > rightToLeft[k]) { rightToLeft[k+1] = rightToLeft[k] + 1; } else { rightToLeft[k+1] = rightToLeft[k]; } ++k; } for (int i = 0; i < k; ++i) { rightToLeft[i]++; } //求最大值即为要求的 for (int i = 0; i < len; ++i) { cout<<"i: "<<i<<" "<<lefToRight[i]<<" "<<rightToLeft[len-i-1]<<endl; if (lefToRight[i] + rightToLeft[len-i-1] > maxLen) maxLen = lefToRight[i] + rightToLeft[len-i-1]; } cout<<"maxLen:"<<maxLen<<endl; delete LIS; delete lefToRight; delete rightToLeft; return len - maxLen + 1;}int main(){ int arr[] = {1,5,7,6,9,3,8,4,2}; int ret; ret = DoubleEndLIS(arr, 9); cout<<ret<<endl; return 0;}
0 0
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。 题目描述:
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。
- 从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小
- 双端LIS问题:从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。
- 在数组中删除尽可能少的数,使得数组满足“先由小到大,再由大到小”
- 输入n个数,分别将这些数从大到小排列输出和从小到大排列输出
- 输入3个从小到大的数,并按从大到小的顺序输出
- 从小到大输出一列数
- ZOJ 1078 题目大意是 :判断 一些数在从二到十六的进制是否是回文数
- 从n个数中找出每个数的重复数
- 三个数按从大到小的顺序排列
- 三个数从大到小
- 三个数,从大到小
- 设计一个从5个整数中取最小数和最大数的程序---acm题目
- ObjectC----字典类和集合类以及快速枚举和OC中的数组排序
- 第四周项目一三角形类的构造函数-3
- UVA - 11991 Easy Problem from Rujia Liu?
- uva 10201 dp油费问题
- 定义一个学生类
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。 题目描述:
- IOS中常用的四种数据持久化方法
- 阻塞线程与非阻塞线程
- 高精度加法
- 2-7 to 2-10
- java 集合排序问题
- 第四周项目一三角形类的构造函数-4
- Linux系统调用列表(http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html)
- C#获取当前主机硬件信息