This is a DP problem. Actually, most problems with minimum or maximum are DP. One thing need to notice in this problem is the symmetric. Paint from the first one is equal with paint from the last one. Another thing is, the choice and cost are only depended on the adjacent house. Use bottom up is the easiest way to do this problem. For each house, we record the minimum cost of each color. And the last house would be the minimum among three colors.
int minCost(vector<vector<int>>& costs) {
int len = costs.size();
if(!len) return 0;
int r=0,g=0,b=0;
for(int i=0;i<len;i++)
{
int rr=r,gg=g,bb=b;
r=cost[i][0]+min(gg,bb);
g=cost[i][1]+min(rr,bb);
b=cost[i][2]+min(rr,gg);
}
return min(r,min(g,b));
}