简单dp
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
int length=costs.size();
if(length==0)
return 0;
int **dp=new int*[length];
for(int i=0;i<length;i++)
dp[i]=new int[3];
dp[0][0]=costs[0][0];
dp[0][1]=costs[0][1];
dp[0][2]=costs[0][2];
for(int i=1;i<length;i++)
{
dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0];
dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i][1];
dp[i][2]=min(dp[i-1][0],dp[i-1][1])+costs[i][2];
}
return min(dp[length-1][0],min(dp[length-1][1],dp[length-1][2]));
}
};
将所有的状态保存下来存到dp表,每次状态转移都是只有三种状态,保存所有到该步骤的局部最优,最后从三种局部最优中找到全局最优。如果dp[i]表示到第i步的最少代价,只是局部最优,并非全局最优,