2023-07-13力扣每日一题

链接:

931. 下降路径最小和

题意:

一个方形整数数组(下称数组),求数组的下降路径最小和

下降路径就是每行选一个数,且和上一个选择的数字列偏差小于等于1(要么选正下,要么左下,要么右下)

解:

思维,逆推可发现,到达这个格子的下降路径最小值只和上一行的三个格子有关,假如(1,1)最小值就是(0,0),(0,1),(0,2)中的最小值加上(1,1)的值

数组大小100*100,每个格子比较三个数,就是3E4

实际代码:

#include<bits/stdc++.h>
using namespace std;
constexpr int Nmax=1E2+7;
int minFallingPathSum(vector<vector<int>>& matrix)
{
    int n=matrix.size(),m=matrix[0].size();
    //cout<<n<<" "<<m<<endl;
    vector<vector<int>>water;
    for(int i=0;i<n;i++)
    {
        vector<int>temp;temp.clear();
        for(int j=0;j<m;j++)
        {
            if(i==0) temp.push_back(matrix[i][j]);
            else
            {
                int t=matrix[i][j]+water[i-1][j];
                if(j>0) t=min(matrix[i][j]+water[i-1][j-1],t);
                if(j+1<m) t=min(matrix[i][j]+water[i-1][j+1],t);
                temp.push_back(t);
            }
        }
        water.push_back(temp);
    }
    
    int ans=INT_MAX;
    for(auto i:water[n-1])
    {
        ans=min(ans,i);
    }
    return ans;
}
int main()
{
    vector<vector<int>> matrix;
    int n,m;cin>>n>>m;
    
    for(int i=1;i<=n;i++)
    {
        vector<int>temp;temp.clear();
        for(int j=1;j<=m;j++)
        {
            int t;cin>>t;
            temp.push_back(t);
        }
        matrix.push_back(temp);
    }
    
    int ans=minFallingPathSum(matrix);
    cout<<ans<<endl;
    return 0;
}

限制:

  • n == matrix.length == matrix[i].length

  • 1 <= n <= 100

  • -100 <= matrix[i][j] <= 100

猜你喜欢

转载自blog.csdn.net/Fei_WuYan/article/details/131712857