P1004 [NOIP2000 提高组] 方格取数

原题直通车

题目大意

给出一张标有值的方格图,从左上到右下走两次,使经过的格子中的数之和最大(重复走的只算一次)

解题思路

一看到数据范围1<=n<=9,写暴力的想法就冒出来了,枚举路径求最小值不就行了吗?但是别忘了实际上路径总数并不少,那该怎么办呢?第二次走的部分格子值已经变过了,难道要每次重置一幅图吗?

我们可以用类似P1002的方法,递推得到当前的答案。至于第一次走对第二次产生的影响,只要两次一块儿处理就可以了。这样就不用改地图,只要特判两次坐标相同的情况了。

AC Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[15][15],f[15][15][15][15],ans;
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin>>n;
    int x,y,z;
    cin>>x>>y>>z;
    while(x||y||z)//先建路径表
    {
        a[x][y]=z;
        cin>>x>>y>>z;
    }
    for(int i=1;i<=n;i++)//由于n≤10,所以四重循环也不会超时
    {
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=n;k++)
            {
                for(int l=1;l<=n;l++)
                {
                    //(i,j)是第一次的位置,(k,l)是第二次的位置
                    f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i-1][j][k][l-1],max(f[i][j-1][k-1][l],f[i][j-1][k][l-1])))+a[i][j]+a[k][l];//取所有路径的最大值
                    if(i==k&&j==l)f[i][j][k][l]-=a[i][j];//两遍踩在同一个格子上的情况需要特判
                }
            }
        }
    }
    cout<<f[n][n][n][n];//输出最后一个格子
    return 0;
}

后记

本人实力有限不会刷题,所以后面的题解不在会是按照题号发布的了,给自己留一个大坑

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值