ZOJ 1827 SG函数 或 dp

本文介绍了一种使用SG函数解决博弈论问题的方法,并通过一个具体的DP实现来展示如何利用递归和状态压缩来确定游戏的胜败状态。该方法适用于如取石子等两人轮流进行的游戏中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dp[sum][_1][_2][_3][_4][_5][_6] 为某个sg函数的状态 用依次的转移转化胜负状态,感觉对sg函数有更深的理解了

SG函数的代码 dp的代码也类似


#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef  long long LL;
const double PI = acos(-1.0);

template <class T> inline  T MAX(T a, T b){if (a > b) return a;return b;}
template <class T> inline  T MIN(T a, T b){if (a < b) return a;return b;}

const int N = 111;
const int M = 11111;
const LL MOD = 1000000007LL;
const int dir[4][2] = {1, 0, -1, 0, 0, -1, 0, 1};
const int INF = 0x3f3f3f3f;

int dp[40][6][6][6][6][6][6];

int sg(int sum, int _1, int _2, int _3, int _4, int _5, int _6)
{
	int i, j, k, vis[10];
	memset(vis, 0, sizeof(vis));
	int &ans = dp[sum][_1][_2][_3][_4][_5][_6];
	if (sum == 31)
	{
		ans = 0;
		return 0;
	}
	if (ans != -1) return ans;
	if (_1 > 0 && sum + 1 <= 31)
	{
		vis[sg(sum + 1, _1 - 1, _2, _3, _4, _5, _6)] = 1;
	}
	if (_2 > 0 && sum + 2 <= 31)
	{
		vis[sg(sum + 2, _1, _2 - 1, _3, _4, _5, _6)] = 1;
	}
	if (_3 > 0 && sum + 3 <= 31)
	{
		vis[sg(sum + 3, _1, _2, _3 - 1, _4, _5, _6)] = 1;
	}
	if (_4 > 0 && sum + 4 <= 31)
	{
		vis[sg(sum + 4, _1, _2, _3, _4 - 1, _5, _6)] = 1;
	}
	if (_5 > 0 && sum + 5 <= 31)
	{
		vis[sg(sum + 5, _1, _2, _3, _4, _5 - 1, _6)] = 1;
	}
	if (_6 > 0 && sum + 6 <= 31)
	{
		vis[sg(sum + 6, _1, _2, _3, _4, _5, _6 - 1)] = 1;
	}
	i = 0;
	while (vis[i]) i++;
	ans = i;
	return ans;
}




int main()
{
	char str[50];
	int num[10];
	while (scanf("%s", str) != EOF)
	{
		int sum = 0, i, j, k, l;
		l = strlen(str);
		fill(num, num + 7, 4);
		for (i = 0; i < l; ++i)
		{
			sum += str[i] - '0';
			if (sum > 31)
			{
				if (i & 1)
				{
					printf("%s B\n", str);
				}
				else
				{
					printf("%s A\n", str);
				}
				break;
			}
			num[str[i] - '0']--;
		}
		if (sum > 31) continue;
		memset(dp, -1, sizeof(dp));
		if (sg(sum, num[1], num[2], num[3], num[4], num[5], num[6]) != 0)
		{
			if (l & 1) printf("%s B\n", str);
			else printf("%s A\n", str);
		}
		else
		{
			if (l & 1) printf("%s A\n", str);
			else printf("%s B\n", str);
		}
	}
	return 0;
}


内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值