链接:
题意:
一个方形整数数组(下称数组),求数组的下降路径的最小和
下降路径就是每行选一个数,且和上一个选择的数字列偏差小于等于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