NC20510. [ZJOI2013]蚂蚁寻路
描述
输入描述
第一行三个数n,m,k。意义如题目描述。
接下来一个n 行m 列的整数矩阵,表示棋盘。
输出描述
一个数,表示蚂蚁所走路径围出的图形可能的最大权值和。
示例1
输入:
2 5 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
输出:
-8
C++(g++ 7.5.0) 解法, 执行用时: 55ms, 内存消耗: 8184K, 提交时间: 2022-12-30 10:18:10
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=210; const int inf=1000000000; int n,m,k; int a[maxn][maxn],s[maxn][maxn],f[maxn][maxn][maxn],g[maxn][maxn][maxn][3],ans=-inf; int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); s[i][j]=s[i-1][j]+a[i][j]; } k=k*2+1; for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) f[0][i][j]=g[0][i][j][1]=g[0][i][j][0]=-inf; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int p=1;p<=k;p++) { for(int h=i;h>=1;h--) f[j][p][h]=max(f[j-1][p][h],g[j-1][p-1][h][p%2])+s[i][j]-s[h-1][j]; g[j][p][1][0]=-inf; for(int h=2;h<=i;h++) g[j][p][h][0]=max(g[j][p][h-1][0],f[j][p][h-1]); g[j][p][i][1]=-inf; for(int h=i-1;h>=1;h--) g[j][p][h][1]=max(g[j][p][h+1][1],f[j][p][h+1]); } ans=max(ans,max(f[j][k][i],g[j][k][i][0])); } } printf("%d\n",ans); return 0; }