最长递增子序列 ( LIS )——The All-purpose Zero ( HDU 5773 ) ( 2016 Multi-University Training Contest 4 1010 )
2016-07-28 22:09
447 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5773
分析:
给出N个数,其中0可以被替换成 0 ~ 9 的任何数字,问替换后这N个数的最长递增子序列的长度为多少?
题解:
为了保证严格递增,我们把每一个数都减去这个数之前的0的个数,然后去掉0,做一次LIS求出长度,然后加上0的个数就是原来数列的LIS长度了。
LIS模板:
AC代码:
http://acm.hdu.edu.cn/showproblem.php?pid=5773
分析:
给出N个数,其中0可以被替换成 0 ~ 9 的任何数字,问替换后这N个数的最长递增子序列的长度为多少?
题解:
为了保证严格递增,我们把每一个数都减去这个数之前的0的个数,然后去掉0,做一次LIS求出长度,然后加上0的个数就是原来数列的LIS长度了。
LIS模板:
int DP[Maxn]; int LIS(int arr[],int n)//arr为数列,n为数列长度,数列从0开始。 { memset(DP, 0, sizeof(DP)); int i,top,mid,low,high; top = 0; DP[0] = -1; for(i=0;i<n;i++) { if(arr[i]>DP[top]) DP[++top] = arr[i]; else { low = 1; high = top; while(low <= high) { mid = (low + high)/2; if(arr[i] > DP[mid]) low = mid + 1; else high = mid - 1; } DP[low] = arr[i]; } } return top; }
AC代码:
#include <cstdio> #include <iostream> #include <cmath> #include <cstring> #define Maxn 112345 using namespace std; int N; int a[Maxn]; int DP[Maxn]; int LIS(int arr[],int n) { memset(DP, 0, sizeof(DP)); int i,top,mid,low,high; top = 0; DP[0] = -1; for(i=0;i<n;i++) { if(arr[i]>DP[top]) DP[++top] = arr[i]; else { low = 1; high = top; while(low <= high) { mid = (low + high)/2; if(arr[i] > DP[mid]) low = mid + 1; else high = mid - 1; } DP[low] = arr[i]; } } return top; } int main() { int T; scanf("%d", &T); int ii =1; while(T--) { memset(a, 0, sizeof(a)); scanf("%d", &N); int Zero = 0; int index = 0; for(int i=0; i<N;i++) { int x; scanf("%d", &x); if(x) a[index++] = x - Zero; else Zero++; } //cout << LIS(a,index) <<endl; printf("Case #%d: %d\n", ii++, LIS(a,index)+Zero ); } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法