Cod sursa(job #1750426)

Utilizator vendettaSalajan Razvan vendetta Data 30 august 2016 10:58:34
Problema Pedefe Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int nmax = 505;
const int pmax = 105;
const int mod = 666013;

int a[nmax], b[nmax], c[nmax];
int dp[nmax][nmax][pmax];
int n, m, p;

void update(int &x, int y){
	x += y;
	x %= mod;
}

int main() {
	freopen("pedefe.in", "r", stdin);
	freopen("pedefe.out", "w", stdout);
	cin >> n >> m >> p;
	for(int i=1; i<=n; ++i){
		cin >> a[i];
	}
	for(int j=1; j<=m; ++j){
		cin >> b[j];
	}
	for(int i=1; i<=p; ++i){
		cin >> c[i];
	}
	dp[0][0][0] = 1;
	for(int i=1; i<=n; ++i){
		for(int j=1; j<=m; ++j){
			if (a[i] != b[j]){
				continue;
			}
			for(int k=0; k<=p; ++k){
				if (k == 0 || a[i] != c[k]){
					for(int i2=0; i2<i; ++i2){
						for(int j2=0; j2<j; ++j2){
							if (a[i2] == b[j2] && a[i2] <= a[i]){
								update(dp[i][j][k], dp[i2][j2][k]);
							}
						}
					}
				}else{
					for(int i2=0; i2<i; ++i2){
						for(int j2=0; j2<j; ++j2){
							if (a[i2] == b[j2] && a[i2] <= a[i]){
								update(dp[i][j][k], dp[i2][j2][k-1]);
							}
						}
					}
				}
			}
		}
	}
	
	int ans = 0;
	for(int i=1; i<=n; ++i){
		for(int j=1; j<=m; ++j){
			update(ans, dp[i][j][p]);
		}
	}
	cout << ans << "\n";
	
	return 0;
}