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; }
浙公网安备 33010602011771号