sgu 168 Matrix

题意:矩阵中式子的值。

找规律发现res[i][j]就是取对角线和x=i的围的面积的右下角。那么要么最小在第j列产生,要么在j+1列以上产生。j+1列以上产生时就等于res[i-1][j+1],看面积就知道。i-1<1时就找1.

//#pragma comment(linker,"/STACK:1024000000,1024000000") 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#define mkp make_pair
using namespace std;
typedef long long lon;
const int SZ=1010,INF=0x7FFFFFFF;
int arr[SZ][SZ],res[SZ][SZ];

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin); 
    //int casenum=1;
    //cin>>casenum;
    //for(int time=1;time<=casenum;++time)
    //for(;scanf("%d",&n)!=EOF;)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)cin>>arr[i][j];
        }
        for(int j=m;j>=1;--j)
        {
            int colmin=INF;
            for(int i=n;i>=1;--i)
            {
                colmin=min(colmin,arr[i][j]);
                res[i][j]=colmin;
                if(j+1<=m)
                {
                    if(i-1>=1)res[i][j]=min(res[i][j],res[i-1][j+1]);
                    else res[i][j]=min(res[i][j],res[1][j+1]);
                }
            }
        }
        
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
            {
                if(j!=1)cout<<" ";
                cout<<res[i][j];
            }cout<<endl;
        }
    }
    return 0;
}

 

posted @ 2018-10-14 20:48  degvx  阅读(120)  评论(0)    收藏  举报