bzoj 3111: [Zjoi2013]蚂蚁寻路

本文介绍了一种使用动态规划(DP)解决蚂蚁爬墙路径最大值问题的方法。通过将问题转化为一系列矩形来简化计算过程,并给出了具体的实现代码。

题面:
这里写图片描述这里写图片描述
题解:
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);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值