bzoj 3111: [Zjoi2013]蚂蚁寻路

来源:互联网 发布:星星知我心演员表 编辑:程序博客网 时间:2024/06/03 09:54

题面:
这里写图片描述这里写图片描述
题解:
DP。很明显蚂蚁爬的路径就是类似城墙一样的锯齿型,上面一上一下,下面一条直线。整个图形可以分成2k+1个矩形,DP就好了。具体式子看zigzag大佬的博客

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,m,K,ans,a[110][110],s[110][110],f[110][110][110],inf=1<<30;int mx[110][110][110][2];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<<1|1;    for(int i=1;i<=n;i++)        for(int j=1;j<=K;j++)            f[0][j][i]=mx[0][j][i][0]=mx[0][j][i][1]=-inf;    ans=-inf;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            for(int k=1;k<=K;k++)            {                for(int l=i;l;l--)                    f[j][k][l]=max(f[j-1][k][l],mx[j-1][k-1][l][k&1])+s[i][j]-s[l-1][j];                mx[j][k][1][0]=-inf;                for(int l=2;l<=i;l++)                    mx[j][k][l][0]=max(mx[j][k][l-1][0],f[j][k][l-1]);                mx[j][k][i][1]=-inf;                for(int l=i-1;l>0;l--)                    mx[j][k][l][1]=max(mx[j][k][l+1][1],f[j][k][l+1]);            }            ans=max(ans,max(f[j][K][i],mx[j][K][i][0]));        }    }    printf("%d",ans);}
原创粉丝点击