求调awa
查看原帖
求调awa
757647
zhangzhixing99楼主2025/7/29 12:24

80pts\text{80pts}#1720\#17 \sim 20 全都似(WA\color{#FF0000}\text{WA})掉了!!!
这四个测试点全都输出 00

代码:

#include <bits/stdc++.h>
using namespace std;

#define EOL '\n'

#define __LOG true
#ifdef __LOG
#define PRINTF printf
#else
#define PRINTF //
#endif

#define __IOFILE true
#ifdef __IOFILE
#define FREOPEN freopen
#else
#define FREOPEN //
#endif

int n, m, a[20][20], b[20][20], directly[20];
map<long long, int> f;

long long qpow(int x, int y)
{
	long long ret = 1, mul = x;
	while (y)
	{
		if (y & 1)
		{
			ret *= mul;
		}
		mul *= mul;
		y >>= 1;
	}
	return ret;
}

void dfs(int cnt, int _start, long long status)
{
	if (cnt > m)
	{
		int sum = 0;
		for (int i = 1; i <= m; ++i)
		{
			sum += directly[i];
		}
		bool FeiFeis_turn = !((n * m - sum) & 1);
		for (int i = m; i >= 1; --i) 
		{
			if (i == m || directly[i] < directly[i + 1])
			{
				int next_status = status + qpow(n + 1, m - i);
				int score_d = f[status];
				if (FeiFeis_turn)
				{
					score_d -= b[n - directly[i]][i];
				}
				else
				{
					score_d += a[n - directly[i]][i];
				}
				if (!f.count(next_status))
				{
					f[next_status] = score_d;
				}
				else if (FeiFeis_turn)
				{
					if (f[next_status] > score_d)
					{
						f[next_status] = score_d;
					}
				}
				else
				{
					if (f[next_status] < score_d)
					{
						f[next_status] = score_d;
					}
				}
			}
		}
		return;
	}
	for (directly[cnt] = _start; directly[cnt] <= n; ++directly[cnt])
	{
		dfs(cnt + 1, directly[cnt], status * (n + 1) + directly[cnt]);
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m; ++j)
		{
			cin >> a[i][j];
		}
	}
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m; ++j)
		{
			cin >> b[i][j];
		}
	}
	long long k = qpow(n + 1, m) - 1;
	f[0] = 0;
	dfs(1, 0, 0);
	cout << f[k] << EOL;
	return 0;
}
2025/7/29 12:24
加载中...