Triangle - LeetCode

題目連接

Triangle - LeetCode數組

注意點

  • 樹是以vector的形式給出
  • 貪心算法只能給出局部最優解而不是全局最優解,因此要用dp算法

解法

解法一:以triangle自己爲dp數組,狀態轉移方程爲triangle[i][j] = min(triangle[i - 1][j - 1], triangle[i - 1][j]) + triangle[i[j],而位於邊界的結點則是直接加上上一層的值。code

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int i,j,size = triangle.size();
        if(size < 1) return 0;
        for(i = 1;i < size;i++)
        {
            int len = triangle[i].size();
            for(j = 0;j < len;j++)
            {
                if(j == 0) triangle[i][j] += triangle[i-1][j];
                else if(j == len-1) triangle[i][j] += triangle[i-1][j-1];
                else triangle[i][j] += min(triangle[i-1][j-1],triangle[i-1][j]);
            }
        }
        return *min_element(triangle[size-1].begin(),triangle[size-1].end());
    }
};

解法二:解法一雖然不用開闢新的空間,可是修改了原數組。能夠複製三角形最後一行,做爲用來更新的一維數組,而後逐個遍歷這個DP數組,對於每一個數字,和它以後的元素比較選擇較小的再加上面一行相鄰位置的元素作爲新的元素,而後一層一層的向上掃描。blog

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int i,j,size = triangle.size();
        vector<int> dp(triangle[size-1]);
        for(i = size-2;i >= 0;i--)
        {
            for(j = 0;j <= i;j++)
            {
                dp[j] = min(dp[j],dp[j+1])+triangle[i][j];
            }
        }
        return dp[0];
    }
};

小結

相關文章
相關標籤/搜索