首页 > 代码库 > UVa 111 - History Grading
UVa 111 - History Grading
题目:历史上有一些事件发生的先后顺序,现在有很多学生写了不同的顺序表,
判断每个学生的最大的前后顺序正确的序列。
分析:dp,LIS,最大上升子序列。
注意本题的数据格式,串里的每个元素对应于:对应下标编号的事件在表中的位置;
状态:F(n)记录以第n个元素为结束元素的序列的最长上升子序列,有转移方程:
F(n)= max(F(i)+1) { 其中 0 < i < n 且 data[i] < data[n] }。
说明:发现好多dp题(⊙_⊙)。
#include <iostream> #include <cstdlib> using namespace std; int A[22],B[22],L[22]; int main() { int n,t; cin >> n; for (int i = 1 ; i <= n ; ++ i) cin >> A[i]; while (cin >>t) { B[t] = 1; for (int i = 2 ; i <= n ; ++ i) { cin >> t; B[t] = i; } for (int i = 1 ; i <= n ; ++ i) { L[i] = 1; for (int j = 1 ; j < i ; ++ j) if (A[B[j]] < A[B[i]] && L[j] >= L[i]) L[i] = L[j]+1; } int max = 0; for (int i = 1 ; i <= n ; ++ i) if (max < L[i]) max = L[i]; cout << max << endl; } return 0; }
UVa 111 - History Grading
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。