You are given N*M matrix A. You are to find such matrix B, that B[i,j]=min{ A[x,y] : (y>=j) and (x>=i+j-y) }
动态规划,枚举对角线,
因为是取最值,
所以取值区域可以重叠,
就可以得出递推式。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>
const int MAXN = 1005;
int n , m;
int A[MAXN][MAXN] = {0};
int B[MAXN][MAXN] = {0};
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE
freopen("sgu168.in","r",stdin);
freopen("sgu168.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i = 1;i <=n; i++)
for(int j = 1; j <= m; j++)
{
scanf("%d",&A[i][j]);
B[i][j] = A[i][j];
}
for(int L = n + m ; L > 1 ; L-- )
for(int j = min(m , L - 1),lmt = max(L - n ,1); j >= lmt ; j--)
{
int i = L - j;
// B[i][j] = min(B[i-1][j+1] ,B[i+1][j])
if(i - 1 >0 && j + 1 <= m)
B[i][j] = min(B[i][j],B[i-1][j+1]);
if(i + 1 <= n)
B[i][j] = min(B[i][j],B[i+1][j]);
if(j < m)
B[i][j] = min(B[i][j],B[i][j+1]); //1*2矩阵
}
for(int i = 1;i <=n; i++)
{
for(int j = 1; j < m; j++)
printf("%d ",B[i][j]);
printf("%d\n",B[i][m]);
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}