只用看代码 dfs 记忆化部分,其余部分代码相同。保证输入输出无问题 30分记忆化:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 15
#define int long long
int n , map[MAXN][MAXN] , dp[MAXN][MAXN][MAXN][MAXN];
const int dx[2] = {1 , 0} , dy[2] = {0 , 1};
int dfs (int x1 , int y1 , int x2 , int y2)
{
int &dpf = dp[x1][y1][x2][y2];
if(dpf != -1) return dpf;
if(x1 == n && y1 == n && x2 == n && y2 == n) return dpf = 0;
for(int i = 0 ; i <= 1 ; i ++)
{
int tx = x1 + dx[i] , ty = y1 + dy[i];
if(tx <= n && tx >= 1 && ty <= n && ty >= 1)
{
int mk = map[tx][ty];
map[tx][ty] = 0;
dpf = max (dpf , dfs(tx,ty,x2,y2)+mk);
map[tx][ty] = mk;
}
tx = x2 + dx[i] , ty = y2 + dy[i];
if(tx <= n && tx >= 1 && ty <= n && ty >= 1)
{
int mk = map[tx][ty];
map[tx][ty] = 0;
dpf = max (dpf , dfs(x1,y1,tx,ty)+mk);
map[tx][ty] = mk;
}
}
return dpf;
}
sign main()
{
...
while (true)
{
...
}
cout << dfs(0,1,0,1);
return 0;
}
100分代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 15
int n , map[MAXN][MAXN] , dp[MAXN][MAXN][MAXN][MAXN];
const int dx[2] = {1 , 0} , dy[2] = {0 , 1};
int dfs (int x1 , int y1 , int x2 , int y2)
{
int &dpf = dp[x1][y1][x2][y2];
if(dpf != -1) return dpf;
if(x1 == n && y1 == n && x2 == n && y2 == n) return dpf = 0;
for(int i = 0 ; i <= 1 ; i ++)
{
int tx1 = x1 + dx[i] , ty1 = y1 + dy[i];
if(tx1 < 1 || tx1 > n || ty1 < 1 || ty1 > n) continue;
int mk1 = map[tx1][ty1];
map[tx1][ty1] = 0;
for(int j = 0 ; j <= 1 ; j ++)
{
int tx2 = x2 + dx[j] , ty2 = y2 + dy[j];
if(tx2 < 1 || tx2 > n || ty2 < 1 || ty2 > n) continue;
int mk2 = map[tx2][ty2];
map[tx2][ty2] = 0;
dpf = max (dpf , dfs (tx1,ty1,tx2,ty2) + mk1 + mk2);
map[tx2][ty2] = mk2;
}
map[tx1][ty1] = mk1;
}
return dpf;
}
sign main()
{
...
while (true)
{
...
}
cout << dfs(0,1,0,1);
return 0;
}
很不理解两篇代码记忆化看着应该是一样的,但A代码没过样例30分