hdu6197array array array(最长上升子序列二分版)
来源:互联网 发布:培训矩阵图 编辑:程序博客网 时间:2024/06/04 19:28
题意:
给你一个长度为n的数组;问你能不能在删除k个元素后,使得数组变为一个非增序列或者非减序列。
思路:
1.记录dp[i]为以第i个元素为结尾的最长非增(减)子序列。时间复杂度O(n*n);这题数据范围T了;
代码:
#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+7;int dp1[maxn],dp2[maxn],arr[maxn];int main(){ int t; cin>>t; while(t--) { int n,k; scanf("%d%d",&n,&k); for(int i = 1;i<=n;i++) scanf("%d",arr+i); for(int i = 1;i<=n;i++) dp1[i] = 1,dp2[i] = 1; for(int i = 2;i<=n;i++) { for(int j = 1;j<i;j++) { if(arr[j]<=arr[i]) dp1[i] = max(dp1[i],dp1[j]+1); } } for(int i = 2;i<=n;i++) { for(int j = 1;j<i;j++) { if(arr[j]>=arr[i]) dp2[i] = max(dp2[i],dp2[j]+1); } } int len = 1,len1 = 1;; for(int i = 1;i<=n;i++) len = max(len,dp1[i]),len1 = max(len1,dp2[i]); if(min(n-len,n-len1)<=k) printf("A is a magic array.\n"); else printf("A is not a magic array.\n"); } return 0;}
2.dp[i]记为长度为i的非增(减)序列的末尾元素可取的最小(大)值。所以只需要更新n次dp数组即可,因为dp数组是递增(减)的,所以可以二分更新,,时间复杂度O(nlogn),AC
代码:
#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+7;int dp1[maxn],dp2[maxn],arr[maxn];int main(){ int t; cin>>t; while(t--) { int n,k; scanf("%d%d",&n,&k); int len = 1; for(int i = 1;i<=n;i++) scanf("%d",arr+i); dp1[len] = arr[1]; for(int i = 2;i<=n;i++) { if(arr[i]>=dp1[len]) dp1[++len] = arr[i]; else { int l = 1,r = len; while(l<r) { int mid = (l+r)>>1; if(dp1[mid]<=arr[i]) l = mid+1; else r = mid; } if(dp1[l]>arr[i]) dp1[l] = arr[i]; } } int len1 = 1; dp2[len1] = arr[1]; for(int i = 2;i<=n;i++) { if(arr[i]<=dp2[len]) dp2[++len] = arr[i]; else { int l = 1,r = len1; while(l<r) { int mid = (l+r)>>1; if(arr[i]<=dp2[len]) l = mid+1; else r= mid; } if(arr[i]>dp2[l]) dp2[l] = arr[i]; } } if(min(n-len,n-len1)<=k) printf("A is a magic array.\n"); else printf("A is not a magic array.\n"); } return 0;}
阅读全文
1 0
- hdu6197array array array(最长上升子序列二分版)
- array array array (最长上升子序列变形)
- hdu 5532 Almost Sorted Array 最长上升子序列
- hdu5532 Almost Sorted Array--最长上升子序列
- HDU5532 Almost Sorted Array(最长不上升子序列)
- HDU6197 array array array 最长上升子序列(模板题)
- HDU 6197 array array array(最长上升或下降子序列)
- HDU 6197 array array array (2017沈阳网赛- 最长上升子序列)
- hdu-6197 array array array(最长上升子序列(LIS)长度的O(nlogn)算法)
- hdu 6197 array array array (LIS,最长上升子序列模板题)
- hdu 5532 Almost Sorted Array(最长上升(不下降)子序列和最长下降(不上升)子序列)
- HDU 6197 array array array(最长不下降子序列)
- 最长上升子序列 二分优化
- 最长上升子序列 (二分 nlogn)
- Hduoj1025【最长上升子序列 + 二分】
- 最长上升子序列 (二分)
- 二分求最长上升子序列
- 最长上升子序列,LIS<DP+二分>
- 富文本编辑器UEditor的配置使用方法
- Python 运算符
- Java程序设计基础-第五章
- c++ map的一些基础函数用法
- Python正则表达式
- hdu6197array array array(最长上升子序列二分版)
- ubuntu 的基本命令
- GUI1
- 常用数学符号的 LaTeX 表示方法
- UVa 712 S-Trees
- mysql explain 的type解释
- Android 7.1 应用快捷方式(ShortcutManager的使用)
- SpringMVC实现查询结果下载为CSV文件
- [python]leetcode(105). Construct Binary Tree from Preorder and Inorder Traversal