[SCOI2005]最大子矩阵 动态规划
没啥难度,送分题:
Code:
#include<cstdio> #include<algorithm> #include<string> #include<cstring> using namespace std; const int maxn=105; const int inf=-100000000; int val[maxn][maxn],sumv[maxn]; int dp[maxn][maxn][20]; int left[maxn], right[maxn]; void SetIO(string a){ string in=a+".in",out=a+".out"; freopen(in.c_str(),"r",stdin); freopen(out.c_str(),"w",stdout); } void end(){ fclose(stdin); fclose(stdout); } void update(int &a,int b){ if(b>a) a=b; } int main(){ //SetIO("sweet"); int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) scanf("%d",&val[i][j]); int ans=0; for(int i=1;i<=n;++i){ left[i]=left[i-1]+val[i][1]; right[i]=right[i-1]+val[i][2]; } for(int i=0;i<=n;++i) for(int j=0;j<=n;++j) { if(i==0&&j==0)continue; for(int p=1;p<=k;++p) { if(i==j) { for(int st=i-1;st>=0;--st) { update(dp[i][j][p], dp[st][st][p]); update(dp[i][j][p], dp[st][st][p-1]+left[i]-left[st]+right[i]-right[st]); } } for(int st=i-1;st>=0;--st){ update(dp[i][j][p], dp[st][j][p]); update(dp[i][j][p], dp[st][j][p-1]+left[i]-left[st]); } for(int st=j-1;st>=0;--st){ update(dp[i][j][p], dp[i][st][p]); update(dp[i][j][p], dp[i][st][p-1]+right[j]-right[st]); } update(ans,dp[i][j][p]); } } printf("%d",ans); return 0; }