Language Containment of Automata
I will guide you through it, giving you the most important ideas. Yet, I will leave the details for you, many details actually. For two languages $A, B$, it holds that $A\subseteq B$ iff $A\cap\overline{B} = \emptyset$. This is an easy exercise and I leave it to you. Now given two automata $C_1$ and $C_2$, we can check whether $L(C_1)\subseteq L(C_2)$ by checking the emptiness of $L(C_1)\cap \overline{L(C_2)}$. In general, constructing an automaton for the intersection of two automata is easy, regardless of whether the automata are DFAs or NFAs (by easy I mean it can be done in time polynomial in the two automata): indeed, one can show that the product construction of automata can be generalised to NFAs. So, given two NFAs, one can build an NFA over their product to recognise their intersection. Then, to check whether the product automaton is empty, we can simply check if there is a path from an initial state to an accepting state in the product - which can be done in time polynomial in the size of the product automaton (polynomial in the size of the automata that we're intersecting). So, to solve the above problem, one can do the following.
Given automata $C_1$ and $C_2$, construct an automaton for $D = \overline{L(C_2)}$, then construct a product automaton $E$ for $L(C_1)\cap L(D)$, and finally check whether $L(E)$ is empty - which takes time polynomial in $|E| = |C_1|\cdot |D|$. So the complexity depends on the size of $C_1$, and on the size of $D$ which recognizes $\overline{L(C_2)}$. So $|E|$ is polynomial in the sizes of $C_1$ and $C_2$ iff $|D|$ is polynomial in them. To sum up:

If $C_1$ is an NFA and $C_2$ is a DFA, then $D$ is obtained from $C_2$ by flipping accepting and rejecting states. So $|D| = |C_2|$, and thus solving the problem takes time polynomial in $|C_1|\cdot |C_2|$. Hence, the problem in this case is in P.

If $C_1$ is a DFA and $C_2$ is an NFA, then $D$ is obtained from $C_2$ by applying the subset construction. So $|D| = 2^{|C_2|}$, and thus solving the problem takes time polynomial in $|C_1|\cdot 2^{|C_2|}$, which is exponential. Hence, the problem in this case is in EXPTIME. In fact, it can be shown that the problem is in PSPACE. Idea: we do not need to construct the whole product automaton, and then find a path in it. Instead, we can find this path nondeterministically on the fly in polynomial space (use the fact that PSPACE = NPSPACE, and the fact that given a state in the product, you can compute its successor states if you have the description of $C_1$, and $C_2$. Once you guess a successor state, you can remove the current state. This way, you do not need to construct the whole product, you only store the current state in the guessed path). I left out some important small details to you. Also, you can show that the problem in this case is PSPACE-hard by reducing the NFA-universality problem to it. Indeed, given an NFA $A$, a reduction outputs $C_1, C_2$, where $C_1$ is a DFA that accepts all words, and $C_2 = A$. Clearly, $L(A) = \Sigma^*$ iff $L(C_1)\subseteq L(C_2) = L(A)$. Thus, PSPACE-hardness follows.