HihoCoder 1634 Puzzle Game
阿新 • • 發佈:2018-04-06
ring brush set body 矩陣 con pro i++ log
題目:https://cn.vjudge.net/problem/HihoCoder-1634
題意:給你一個矩陣,可以修改其中一個值為p,讓你求最大子矩陣的最小值
我們可以暴力枚舉每個點是否修改
當這個點不在最大矩陣內時,一定是它的上下左右的最大子矩陣大
當這個點在最大矩陣內時,可以直接判斷
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<set> using namespace std; const int N=150+5; const int inf=0x80808080; int L[N],R[N],U[N],D[N]; int a[N][N],dp[N][N],ma[N][N]; int n,m,p; void init() { memset(L,0x80,sizeof(L)); memset(R,0x80,sizeof(R)); memset(U,0x80,sizeof(U)); memset(D,0x80,sizeof(D)); } void solve() { int t; //down memset(dp,0,sizeof(dp)); memset(ma,0x80,sizeof(ma)); t=inf; for(int i=1;i<=n;i++) { for(int l=1;l<=m;l++) { int sum=0; for(int r=l;r<=m;r++) { sum+=a[i][r]; dp[l][r]+=sum; ma[l][r]=max(ma[l][r],dp[l][r]); if (dp[l][r]<0) dp[l][r]=0; t=max(t,ma[l][r]); } } D[i]=t; } //up memset(dp,0,sizeof(dp)); memset(ma,0x80,sizeof(ma)); t=inf; for(int i=n;i>=1;i--) { for(int l=1;l<=m;l++) { int sum=0; for(int r=l;r<=m;r++) { sum+=a[i][r]; dp[l][r]+=sum; ma[l][r]=max(ma[l][r],dp[l][r]); if (dp[l][r]<0) dp[l][r]=0; t=max(t,ma[l][r]); } } U[i]=t; } //right memset(dp,0,sizeof(dp)); memset(ma,0x80,sizeof(ma)); t=inf; for(int i=1;i<=m;i++) { for(int l=1;l<=n;l++) { int sum=0; for(int r=l;r<=n;r++) { sum+=a[r][i]; dp[l][r]+=sum; ma[l][r]=max(ma[l][r],dp[l][r]); if (dp[l][r]<0) dp[l][r]=0; t=max(t,ma[l][r]); } } R[i]=t; } //left memset(dp,0,sizeof(dp)); memset(ma,0x80,sizeof(ma)); t=inf; for(int i=m;i>=1;i--) { for(int l=1;l<=n;l++) { int sum=0; for(int r=l;r<=n;r++) { sum+=a[r][i]; dp[l][r]+=sum; ma[l][r]=max(ma[l][r],dp[l][r]); if (dp[l][r]<0) dp[l][r]=0; t=max(t,ma[l][r]); } } L[i]=t; } } int main() { while(scanf("%d%d%d",&n,&m,&p)!=EOF) { init(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); solve(); int ans=D[n]; /* 為什麽可以枚舉所有點 因為如果這個點不在最大矩陣內, 當D[n]-a[i][j]+p變大時,不影響ans 當D[n]-a[i][j]+p變小時,不影響t */ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { int t=max(max(D[i-1],U[i+1]),max(L[j+1],R[j-1])); t=max(t,D[n]-a[i][j]+p); ans=min(ans,t); } printf("%d\n",ans); } return 0; }
HihoCoder 1634 Puzzle Game