题目链接
专门研究过博弈背景下的记忆化搜索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;
}