user: Uma rua tem `n` casas, onde cada casa pode ser pintada com uma das três cores: vermelho, azul ou verde. O custo de pintar cada casa com uma determinada cor é diferente. Você tem que pintar todas as casas de forma que não haja duas casas adjacentes com a mesma cor.

O custo de pintar cada casa com uma determinada cor é representado por uma matriz de `custos`, de tamanho `n x 3`.

Por exemplo, `custos[0][0]` é o custo de pintar a casa 0 com a cor vermelha; custos[1][2] é o custo de pintar a casa 1 com a cor verde, e assim por diante...

Por favor, escreva um programa que retorne o menor custo possível para pintar todas as casas da rua, dada a matriz `custos`.

assistant: Você pode resolver esse problema usando programação dinâmica. Aqui está um exemplo de programa em Python que retorna o menor custo possível para pintar todas as casas, dada a matriz de custos:

```python
def min_cost_painting(custos):
    n = len(custos)

    if n == 0:
        return 0

    # Inicializa a matriz de programação dinâmica
    dp = [[0 for _ in range(3)] for _ in range(n)]

    # Preenche a primeira linha da matriz com os custos iniciais
    dp[0] = custos[0]

    # Preenche o restante da matriz
    for i in range(1, n):
        dp[i][0] = custos[i][0] + min(dp[i - 1][1], dp[i - 1][2])
        dp[i][1] = custos[i][1] + min(dp[i - 1][0], dp[i - 1][2])
        dp[i][2] = custos[i][2] + min(dp[i - 1][0], dp[i - 1][1])

    return min(dp[-1])  # Retorna o menor custo da última casa


# Exemplo de uso
custos = [
    [17, 2, 17],
    [16, 16, 5],
    [14, 3, 19]
]

print(min_cost_painting(custos))  # Saída: 10

```

Neste exemplo, a função `min_cost_painting` recebe a matriz de custos como entrada e retorna o menor custo possível para pintar todas as casas da rua. A função utiliza programação dinâmica para calcular o menor custo cumulativo em cada etapa, garantindo que não haja duas casas adjacentes com a mesma cor.

user: Pode explicar melhor como funciona o programa? Não percebi como garante que não haja duas casas adjacentes com a mesma cor.

assistant: O programa utiliza a técnica de programação dinâmica para garantir que não haja duas casas adjacentes com a mesma cor.

A ideia é calcular o menor custo possível para pintar cada casa, dada a cor escolhida para as casas anteriores. Isso é feito em etapas, começando da primeira casa até a última. A função min_cost_painting utiliza a matriz de custos para calcular o menor custo possível para pintar todas as casas da rua, garantindo que não haja duas casas adjacentes com a mesma cor.

Aqui está uma explicação mais detalhada sobre como o programa funciona:

* A matriz de custos representa o custo de pintar cada casa com cada uma das três cores.
* A função min_cost_painting utiliza a técnica de programação dinâmica para calcular o menor custo possível para pintar todas as casas da rua.
* A função recebe a matriz de custos como entrada e retorna o menor custo possível.
* O processo é realizado em etapas, começando da primeira casa até a última.
* Na primeira etapa, é calculado o menor custo para pintar a primeira casa com cada uma das cores.
* Na segunda etapa, é calculado o menor custo para pintar a segunda casa com cada uma das cores, levando em consideração o custo da primeira casa.
* Esse processo é repetido para as demais casas até chegar à última, onde é calculado o menor custo acumulado para pintar todas as casas da rua.
* Para garantir que não haja duas casas adjacentes com a mesma cor, o custo mínimo acumulado é calculado levando em consideração a cor escolhida para as casas anteriores.
* Para realizar os cálculos, é criada uma matriz de programação dinâmica com dimensões n x 3, onde n é o número de casas.
* Na matriz, cada linha representa uma casa, e cada coluna representa uma cor.
* A matriz é inicializada com os custos da primeira casa.
* Em cada etapa, o custo mínimo acumulado é calculado para cada cor, levando em consideração o custo da casa atual e o custo mínimo acumulado das outras duas cores nas casas anteriores.
* Ao final do processo, é retornado o menor custo acumulado da última casa.