HDU 6197 DP
来源:互联网 发布:银行管理系统java 编辑:程序博客网 时间:2024/06/11 00:36
题目
array array array
题意
dp,lcs。给你一个 A 数列,和一个数字 k。问你能不能从 A 数列顺序中挑出 k 个元素组成新数列。新数列要满足非递增或非递减。
题解
就是求最长上升子序列 length1 和最长下降子序列 length2。然后如果 (length(A) - length1 <= k || length(A) - length2 <= k) 就可以,反之则不行。
代码
#include <algorithm>#include <bitset>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <climits>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>using namespace std;const int MAX = 100005;int a[MAX];int dp[MAX];int main(){ int t; cin >> t; while(t--){ int n, k; cin >> n >> k; for(int i=0;i<n;++i) { scanf("%d",&a[i]); } fill(dp,dp+n,INT_MAX); for(int i=0;i<n;++i) { *lower_bound(dp, dp + n, a[i]) = a[i]; } int id = 0; for(int i=0;i<n;++i){ if(dp[i] != INT_MAX) id = i + 1; } bool flag = false; if(n - id <= k) flag = true; else{ for(int i=0;i<n/2;++i){ swap(a[i],a[n-i-1]); } fill(dp,dp+n,INT_MAX); for(int i=0;i<n;++i) { *lower_bound(dp, dp + n, a[i]) = a[i]; } id = 0; for(int i=0;i<n;++i){ if(dp[i] != INT_MAX) id = i + 1; } if(n - id <= k) flag = true; } if(flag) cout << "A is a magic array." << endl; else cout << "A is not a magic array." << endl; }; return 0;}
阅读全文
0 0
- HDU 6197 DP
- HDU DP
- DP? HDU
- DP? HDU
- DP? HDU
- 【dp】HDU
- 【dp】HDU
- 【dp】 HDU
- DP? HDU
- HDU 1003 && HDU 1231 DP
- hdu 1058 DP
- HDU 1069 dp
- HDU 1024(DP)
- hdu 1257 dp+贪心
- HDU 1087(DP)
- HDU 1506(DP)
- hdu 2844 DP 背包
- HDU 1087 简单DP
- Nginx代理功能与负载均衡详解
- 搭建ELK(ElasticSearch+Logstash+Kibana)日志分析系统(十一) kinaba demo
- Maximum Subsequence Sum浙大数据结构
- Cookie 工具类
- 使用MyBatis过程中遇到的问题
- HDU 6197 DP
- ReferenceQueue、Reference详解
- udp多线程接受并持久化数据
- 反射_元数据
- android控件属性大全
- view的事件传递机制
- Java Object中的equals和hashCode
- 转载CV_8UC1,CV_8UC2,CV_8UC3的意思
- Maximum Depth of Binary Tree--LeetCode