UVA 111 最长递增子序列
来源:互联网 发布:淘宝二手市场网 编辑:程序博客网 时间:2024/06/14 20:02
维护一个栈的二分写法
题意:
有n个事件,现在给出每一个事件发生的次序。然后让你给学生自己写的答案打分,学生的答案就按照第二种给分的方式。也就是找出学生的答案在正确答案的相对正确的数目最多有多少个!
思路:
虽然题目的输入有点绕,但是只要找到所要求的答案就行。显然要找到学生的答案在正确答案的序列中出现的位置。保存每一个事件的正确位置。然后每当学生的第i个答案选出,就把第i个答案的正确位置赋值给它,
这意味着,学生的每一个选项都会有对应位置,我们只要找到最大递增子序列就行。
其实还有一种解法是转化为原来的次序然后求出公共子序列。
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxn = 100;int n;int s[maxn];int a[maxn],b[maxn];int main(int argc, char const *argv[]){ //freopen("in.txt","r",stdin); scanf("%d",&n); for(int i = 1;i <= n; i++) { int temp; scanf("%d",&temp); a[i] = temp; } int t; while(scanf("%d",&t) != EOF) { b[t] = a[1]; for(int i = 2;i <= n; i++) { int temp; scanf("%d",&temp); b[temp] = a[i]; } memset(s,0,sizeof(s)); s[0] = -1; int len = 0; for(int i = 1;i <= n; i++) { if(b[i] > s[len]) { s[++len] = b[i]; } else { int l = 1,r = len; while(l < r) { int mid = (l + r) >> 1; if(s[mid] < b[i]) l = mid + 1; else r = mid; } s[l] = b[i]; } } printf("%d\n",len); } return 0;}
- 这道题比较难理解的就是输入的转换,其实可以直接还原答案的原来位置,然后把其中正确的答案做映射,然后计算出学生在映射下的递增序列的长度。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1000;int n;int a[maxn],b[maxn];int A[maxn];int s[maxn];int main(int argc, char const *argv[]){ //freopen("in.txt","r",stdin); scanf("%d",&n); for(int i = 1;i <= n; i++) { int temp; scanf("%d",&temp); a[temp] = i; } for(int i = 1;i <= n; i++) { A[a[i]] = i; } int t,temp; while(scanf("%d",&t) != EOF) { b[t] = 1; for(int i = 2;i <= n; i++) { scanf("%d",&temp); b[temp] = i; } memset(s,0,sizeof(s)); s[0] = -1; int len = 0; for(int i = 1;i <= n; i++) { int t = A[b[i]]; if(t > s[len]) { s[++len] = t; } else { int l = 1,r = len; while(l < r) { int mid = (l + r) >> 1; if(t > s[mid]) l = mid + 1; else r = mid; } s[l] = t; } } printf("%d\n", len); } return 0;}
阅读全文
0 0
- UVA 111 最长递增子序列
- UVa 111 - History Grading 最长递增子序列 LIS
- uva 10131(最长递增子序列)
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 跨域访问、同源策略
- alpha、scale、rotate、translate使用xml方式进行配置
- 利用表达式树,计算一个加减乘除(可带括号)的表达式
- 最长递增子序列
- SpinControl控件与动态画图
- UVA 111 最长递增子序列
- TCP、UDP、IP 协议分析
- 线性判别分析简明入门教程
- POJ1239 dp (严格递增子序列)
- java中开辟新线程的两种方法以及区别
- POJ 1141 区间dp
- 英语考试 FZU
- JavaWeb性能优化
- 深入浅出vi(vim)编辑器篇章zero——初始vi(vim)