• leetcode(c++)(坐标DP)


    #include <iostream>
    #include <vector>
    #include <stack>
    
    using namespace std;
    
    int uniquePaths(int m, int n)
    {
        vector<vector<int>>dp(m,vector<int>(n));
        for(int i = 0;i < m; ++i)
        {
            dp[i][0] = 1;
        }
        for(int i = 0; i < n; ++i)
        {
            dp[0][i] = 1;
        }
        for(int i = 1; i < m; ++i)
        {
            for(int j = 1; j < n ; ++j)
            {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
    
    int uniquePathsI(int m, int n)
    {
        vector<int>dp(n,1);
        for(int i = 1; i < m; ++i)
        {
            for(int j = 1; j < n; ++j)
            {
                dp[j] = dp[j] + dp[j-1];
            }
        }
        return dp[n-1];
    }
    
    int uniquePaths(const vector<vector<int>>paths)
    {
        int m = paths.size(), n = paths[0].size();
        vector<vector<int>>dp(m,vector<int>(n));
        for(int i = 0; i < m; ++i)
        {
            if(paths[i][0] == 1)
            break;
            dp[i][0] = 1;
        }
        for(int i = 0;i < n; ++i)
        {
            if(paths[0][i] == 1)
            break;
            dp[0][i] = 1;
        }
        for(int i = 1;i < m; ++i)
        {
            for(int j = 1; j < n; ++j)
            {
                dp[i][j] = paths[i][j]== 1 ? 0 : dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];    
    }
    
    int minimmTotal(const vector<vector<int>>& triangle)
    {
        int n = triangle.size();
        vector<vector<int>>dp(n+1,vector<int>(n+1,0));
        for(int i = n-1; i >= 0 ;--i)
        {
            for(int j = i; j >= 0; --j)
            {
                dp[i][j] = min(dp[i+1][j],dp[i+1][j+1])+triangle[i][j];
            }
        }
        return dp[0][0];
    }
    
    int minPathSum(vector<vector<int>>& grid)
    {
        int m = grid.size(), n = grid[0].size();  
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(i == 0)grid[i][j] += grid[i][j-1];
                else if(j == 0)grid[i][j] += grid[i-1][j];
                else
                grid[i][j]+=min(grid[i-1][j],grid[i][j-1]);
            }
        }
        return grid[m-1][n-1];
    }
    
    int minFallingPathSum(vector<vector<int>>& A)
    {
        int m = A.size(), n = A[0].size();
        for(int i = m - 2; i >= 0; --i)
        {
            for(int j = 0;j < n; ++j)
            {
                int minVal = A[i+1][j];
                if(j > 0)minVal = min(minVal,A[i+1][j-1]);
                if(j+1 < n)minVal = min(minVal,A[i+1][j+1]);
                A[i][j]+=minVal;
            }
        }
        sort(A[0].begin(),A[0].end());
        return A[0][0];
    }
    
    int minFallingPathSumI(vector<vector<int>>& grid)
    {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>>dp(m,vector<int>(n));
        for(int i = 0;i < n ; ++i)dp[0][i] = grid[0][i];
        for(int i = 1; i < m; ++i)
        {
           
            for(int j = 0; j < n; ++j)
            {
                 int preRowMin = INT_MAX;
                 for(int k = 0; k < n; ++k)
                 {
                     if(j != k) preRowMin = min(preRowMin,dp[i-1][k]);
                     dp[i][j] = grid[i][j] + preRowMin;
                 }
            }        
        }
        int res = INT_MAX;
        for(int i = 0;i < n ; ++i)
        {
            res = min(res,dp[m-1][i]);
        }
        return res;
    }
    
    int maxSuqare(const vector<vector<string>>& matrix)
    {
        int m = matrix.size(), n = matrix[0].size();
        int maxVal = INT_MIN;
        vector<vector<int>>dp(m,vector<int>(n));
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(i == 0 || j == 0)
                {
                    if(matrix[i][j] == "1")dp[i][j] = 1;                
                }
                else
                {
                    if(matrix[i][j] == "1")
                    dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1])) + 1;
                }
                maxVal = max(maxVal,dp[i][j]); 
            } 
              
        }
        return maxVal*maxVal;
    }
    
    int largestRectangle(vector<int>& height)
    {
        stack<int>st;
        int res = 0;
        for(int i = 0; i < height.size(); ++i)
        {
            while(!st.empty() && height[i] <= height[st.top()])
            {
                int preHeight = height[st.top()];
                st.pop();
                int width = i - (st.empty() ? 0:st.top() + 1);
                res = max(res,preHeight * width);
            }
            st.push(i);
        }
        while(!st.empty())
        {
            int preHeight = height[st.top()];
            st.pop();
            int width = height.size() - (st.empty() ? 0 :st.top() + 1);
            res = max(res,preHeight * width);
        }
        return res;
    }
    
    int maxRectangle(const vector<vector<string>>& matrix)
    {
        int m = matrix.size();
        if(m == 0)return 0;
        int n = matrix[0].size();
        vector<int>height(n);
        int res = 0;
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0;j < n; ++j)
            {
                if(matrix[i][j] == "0")height[j]=0;
                else ++height[j];        
            }
            res = max(res,largestRectangle(height));
        }
        return res;
    }
    
    int main()
    {
        //LeetCode62
        cout << uniquePaths(3,2) << endl;
        cout << uniquePathsI(3,2) << endl;
    
        //LeetCode63
        // vector<vector<int>>paths{{0,0,0},{0,1,0},{0,0,0}};
        vector<vector<int>>paths{{0,1},{0,0}};
        cout << uniquePaths(paths) << endl;
    
        //LeetCode120
        vector<vector<int>>triangle={{2},{3,4},{6,5,7},{4,1,8,3}};
        cout << minimmTotal(triangle) << endl;
    
        //LeetCode64
        vector<vector<int>>grid{{1,3,1},{1,5,1},{4,2,1}};
        cout << minPathSum(grid) << endl;
    
        //LeetCode931
        vector<vector<int>>grids{{1,2,3},{4,5,6},{7,8,9}};
        // cout << minFallingPathSum(grids) << endl;
    
        //LeetCode1289
        cout << minFallingPathSumI(grids) << endl;
    
        //LeetCode221
        vector<vector<string>>matrix{{"1","0","1","0","0"},{"1","0","1","1","1"},{"1","1","1","1","1"},{"1","0","0","1","0"}};
        cout << maxSuqare(matrix) << endl;
    
        //LeetCode85    
        cout << maxRectangle(matrix) << endl;
        return 0;
    }
  • 相关阅读:
    bzoj4326 NOIP2015 运输计划
    bzoj4293 [PA2015]Siano
    bzoj4238 电压
    bzoj4216 Pig
    bzoj 4237稻草人
    [题解] PowerOJ 1752 运输问题 (最大/小费用最大流)
    [题解] PowerOJ 1748 星际转移问题 (最大流 + 并查集)
    [题解] PowerOJ 1746 航空路线问题 (最大费用最大流)
    [题解] PowerOJ 1754 负载平衡问题 (最小费用最大流)
    [题解] PowerOJ 1753 分配问题 (最大/小费用最大流)
  • 原文地址:https://www.cnblogs.com/fourmi/p/16212442.html
Copyright © 2020-2023  润新知