Все очень просто. Это как разница между гостиницей и частной квартирой.
В квартире живут только те, кто там прописан. Если в ней, скажем, живет семья Сидоровых, то семья Пупкиных, хоть убей, жить там не сможет. При этом в этой квартире может жить Петя Сидоров, потом туда может переехать Гриша Сидоров (иногда они даже могут там жить одновременно - это массив). Это - статичная типизация.
В гостинице может жить одно время семья Сидоровых. Им даже там прописываться не всегда обязательно. Потом они от туда уедут, и туда переедут Пупкины. А потом Кузнецовы. А потом еще кто-нибудь. Это динамическая типизация.
Если вернуться в программирование, то первый случай (статическая типизация) встречается в, скажем, языках С, С++, С#, Java и других. Перед тем, как вы в первый раз присвоете переменной значение, вы должны рассказать, что вы там будете хранить: целые числа, числа с плавающей запятой, строки и тд (в этой квартире будут жить Сидоровы). Динамическая типизация, с другой стороны, подобного не требуют. В момент присваивании значения, вы одновременно присваиваете переменной ее тип (в этом гостиничном номере теперь живет Вася Пупкин из семьи Пупкиных). Подобное встречается в таких языках, как PHP, Python и JavaScript.
В обоих подходах есть свои преимущества и свои недостатки. Какой из них лучше или хуже зависит от решаемых задач. Подробней можно прочитать, скажем, в википедии.