博弈+dfs(ICPC Asia Nanning 2017 Rake It In)

题目链接
专门研究过博弈背景下的记忆化搜索dp什么的,做的时候自信满满,10分钟敲出来秒过样例。愉快的交上去,t了。最后各种卡常,吸氧,尝试记忆化,快读也试了,1003ms,超了3ms,弄不懂了。看了mmk学长博客,一模一样的思路。叫学长代码500ms。。。心态爆炸。今天又看,发现自己的dfs函数,是传结构体的,就是说我开一个struct里面是个矩阵,每次旋转直接传一个转后的矩阵。。c++中传值相当于一个复制过程。导致dfs效率极慢。mmk学长的做法是转完矩阵在转回来。。。。。。。遂将矩阵改成全局。交上,还没反应过来,秒过。。。。这回我这个憨批真是长记性了。。
下面是ac代码:

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <queue>
#define ll long long
using namespace std;
const int N = 1e6+5;
const int inf = 0x3f3f3f3f;
int tmp[5][5];
inline int he(int i, int j)
{
    return tmp[i][j] + tmp[i+1][j]+tmp[i+1][j+1]+tmp[i][j+1];
}
int dfs(int cur)
{
    if (cur == 0) return 0;
    int res;
    if (cur&1) res = inf;
    else res = 0;
    for (int i = 1; i < 4; i++)
    {
        for (int j = 1; j < 4; j++)
        {
            int ans = he(i, j);
            int te = tmp[i][j];
            tmp[i][j] = tmp[i][j+1];
            tmp[i][j+1] = tmp[i+1][j+1];
            tmp[i+1][j+1] = tmp[i+1][j];
            tmp[i+1][j] = te;
            if (cur&1)
                res = min(res, ans + dfs(cur-1));
            else
                res = max(res, ans + dfs(cur-1));
            te = tmp[i][j];
            tmp[i][j] = tmp[i+1][j];
            tmp[i+1][j] = tmp[i+1][j+1];
            tmp[i+1][j+1] = tmp[i][j+1];
            tmp[i][j+1] = te;
        }
    }
    return res;
}
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int n, k;
        scanf("%d",&k);
        for (int i = 1; i <= 4; i++)
            for (int j = 1; j <= 4; j++)
                scanf("%d", &tmp[i][j]);
        printf("%d\n", dfs(2*k));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值