您的位置:首页 > 其它

BZOJ 3111 [Zjoi2013]蚂蚁寻路

2016-10-27 16:30 295 查看


【题目分析】

动态规划。

【代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int f[102][25][102],a[102][102],s[102][102],g[102][25][102][2];
int n,m,k,ans=-inf;
int main()
{
scanf("%d%d%d",&n,&m,&k); k=k*2+1;
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];
}
for (int i=1;i<=k;++i)
for (int j=1;j<=n;++j)
f[0][i][j]=g[0][i][j][0]=g[0][i][j][1]=-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;--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;--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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: