dApps vs Apps
Decentralized apps or dApps connect to a backend that runs on a decentralized blockchain whereas centralized apps or simply apps connect to a backend that runs on centralized servers.

TL;DR:
Decentralized apps or dApps connect to a backend that runs on a decentralized blockchain whereas centralized apps or simply apps connect to a backend that runs on centralized servers.
Apps
These days most companies have apps on which we (the users) do all our daily business, find our entertainment and share our stories. These apps are typically front-end clients that send and receive data between the backend. The backend can be your local machine, an old server in your basement or a cluster of hosted docker containers running on servers in a data centre a.k.a "the cloud". Chances are most, if not all, of your apps connect to some servers that are owned or at least managed by the companies that offer the app you are using. Meaning they have central control over all the data and what happens to the data of that application.
In the theme of blockchain, we can use banks as an example. The bank keeps all your money and they decide what happens to your money. They control where, when, how and what the fees are for your money to move from one account to another. The same goes for any data or service on centralized apps. The company that owns the servers have all the control over which services you can use, what data they record and what they do with the data. These companies usually also operate behind closed doors so the users have no idea how they do what they do.
dApps
Similar to centralized apps, dApps are frontend clients that send and receive data between the backend. However, the backends of dApps are not centrally controlled servers. Instead, the backends are comprised of a peer-to-peer network of nodes(computers) that form part of a decentralized blockchain.
These nodes each have a copy of the entire blockchain. They work together to validate any new block which makes it impossible for a single node to alter the chain. As a bonus, there is almost no chance of your backend ever being offline because it runs on thousands of computers and the chances are very slim for all of them to be offline at the same time.
The backend code of dApps is added to the blockchain through immutable smart contracts. In the case of the popular Ethereum network, these contracts are written in a language called solidity.
Smart contracts are essentially agreements written in open source code that are completely transparent and cannot be interfered with by any single entity.
dApp front-ends connect to the blockchain network through wallet addresses which they then use to send and receive transactions. These transactions can be publishing new contracts or interacting with existing ones. There are many libraries available that make it possible for modern front-ends to connect and interact with blockchain networks. As an example, web3.js is a collection of javascript libraries that allow you to interact with the Ethereum network using HTTP, IPC or WebSocket.
Decentralized exchanges or dexes like Binance are examples of dApps that aim to replace the current banking systems. These exchanges allow users to exchange, sell and trade coins on the blockchain. In contrast to the banks managing all transactions, blockchain transactions allow users to easily exchange coins almost instantaneously at a low cost without any identification or verification.
OpenSea and Rarible are some more examples of dApps that made a big difference for digital artists by allowing them to create, buy and sell their art in the form of NFTs (Non-Fungible Tokens).
Now that we have an idea of what the difference is between centralized and decentralized apps, stay tuned as we dive deeper into web3 and blockchain technologies.