sgu 168

来源:互联网 发布:前妻归来 总裁知错了 编辑:程序博客网 时间:2024/04/27 17:49

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;   }
0 0