博弈+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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章