문제 해결 CF463D [Gargari and Permutations]

1282 단어

Solution CF463D


제목 대의: \(k\)개\(1-n\)의 배열을 구하여\(LCS\)


분석: 우리는\(LCS\)를 서열\(L\)로 설정하고 각각\(val\)로 배열하고 요소\(i\)는 배열에서\(pos i\)로 배열한다. 분명히 모든 서열\(pos {L i}\)는 점차적으로 증가해야 한다.
따라서 우리는\(dp\),\(1\) 번호 서열에\(dp\),\(1\) 번호 서열에\(pos {val j}\leqpos {val i}\)가 있다면 다른 서열에서도 그런지 폭력적으로 검사하고 조건에 부합되면 이전할 수 있습니다.
(dp\) 이전은 본질적으로\(k\) 차원 편향 문제입니다.\(bitset\) 로 최적화할 수 있지만 쓰기가 귀찮습니다.
#include 
using namespace std;
const int maxn = 1024,maxk = 8;
int n,k,ans,val[maxk][maxn],pos[maxk][maxn],f[maxn];
int main(){
    ios::sync_with_stdio(false);
    cin >> n >>k;
    for(int i = 1;i <= k;i++)
        for(int j = 1;j <= n;j++)
            cin >> val[i][j],pos[i][val[i][j]] = j;
    for(int i = 1;i <= n;i++){
        f[i] = 1;
        for(int j = 1;j < i;j++){
            bool flag = 1;
            for(int t = 2;t <= k && flag;t++)
                if(pos[t][val[1][j]] > pos[t][val[1][i]])flag = false;
            if(flag)f[i] = max(f[i],f[j] + 1);
        }
        ans = max(ans,f[i]);
    }
    cout << ans << '
'; return 0; }

전재 대상:https://www.cnblogs.com/colazcy/p/11590493.html

좋은 웹페이지 즐겨찾기