Cod sursa(job #2779433)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 3 octombrie 2021 18:43:58
Problema Pedefe Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD(666013), NMAX(505);

int dp[2][NMAX][NMAX], s1[NMAX], s2[NMAX], s3[NMAX];   ///dp[k][i][j] (S3, S1, S2) = nr de subsiruri comune crescatoare cu elemente din 1...i din S1, 1...j din S2, contine primele k elemente din S3 si se termina cu valoare S1[i]
inline int modul(int val){
    if(val > MOD)
        val -= MOD;
    return val;
}

int main()
{
    freopen("pedefe.in", "r", stdin);
    freopen("pedefe.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n, m, p;
    cin >> n >> m >> p;
    for(int i = 1; i <= n; ++i)
        cin >> s1[i];
    for(int i = 1; i <= m; ++i)
        cin >> s2[i];
    for(int i = 1; i <= p; ++i)
        cin >> s3[i];
    int cur = 1, last = 0, care = 0;
    dp[0][0][0] = 1;
    for(int k = 0; k <= p; ++k)
    {
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= m; ++j)
                if(s1[i] == s2[j])
                {
                    if(s1[i] == s3[k] && k)
                        care = last;
                    else care = cur;
                    dp[cur][i][j] = 0;
                    for(int ax1 = 0; ax1 < i; ++ax1)
                        for(int ax2 = 0; ax2 < j; ++ax2)
                            if(s1[ax1] <= s1[i])
                                dp[cur][i][j] = modul(dp[cur][i][j] + dp[care][ax1][ax2]);
                }
        last = cur;
        cur = 1 - cur;
    }
    int rez = 0;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            rez = modul(rez + dp[last][i][j]);
    cout << rez << '\n';
    return 0;
}