UVa 111 - History Grading

来源:互联网 发布:岚家正品代购 知乎 编辑:程序博客网 时间:2024/05/18 20:05

题目:历史上有一些事件发生的先后顺序,现在有很多学生写了不同的顺序表,

           判断每个学生的最大的前后顺序正确的序列。

分析: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;}

0 0
原创粉丝点击