把给的两个式子转化过来,其实就是每个位置是从他开始向下到底,向右上45度到头,延伸到右下角的一个梯形中的最小值,那么容易得到dp[i][j]=min(a[i][j],dp[i+1][j],dp[i-1][j+1]);注意一下第一行的情况,特殊处理下ok。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
int n,m;
int a[1200][1200];
int dp[1200][1200];
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
memset(dp,0x3f3f,sizeof dp);
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
scanf("%d",&a[i][j]);
int x,y;
for (int j=m; j>=0; j--)
for (int i=n; i>=0; i--)
{
if (i!=0) dp[i][j]=min(a[i][j],min(dp[i-1][j+1],dp[i+1][j]));
else dp[i][j]=min(dp[i][j+1],dp[i+1][j]);
}
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}
return 0;
}