題目鏈接
專門研究過博弈背景下的記憶化搜索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;
}