acwing算法提高之数学知识--博弈论

2024-05-04 10:28

本文主要是介绍acwing算法提高之数学知识--博弈论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1 介绍
  • 2 训练

1 介绍

本博客用来记录博弈论相关的题目。

2 训练

题目1:1319移棋子游戏

C++代码如下,

#include <cstdio>
#include <cstring>
#include <set>using namespace std;const int N = 2010, M = 6010;int n, m, k;
int h[N], e[M], ne[M], idx;
int f[N];void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}int sg(int u) {if (f[u] != -1) return f[u];set<int> S;for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];S.insert(sg(j));}for (int i = 0; ; i++) {if (S.count(i) == 0) {f[u] = i;break;}}return f[u];
}int main() {scanf("%d%d%d", &n, &m, &k);memset(h, -1, sizeof h);for (int i = 0; i < m; ++i) {int a, b;scanf("%d%d", &a, &b);add(a, b);}memset(f, -1, sizeof f);int res = 0;for (int i = 0; i < k; ++i) {int u;scanf("%d", &u);res ^= sg(u);}if (res) puts("win");else puts("lose");return 0;
}

题目2:1321取石子

C++代码如下,

#include <cstdio>
#include <cstring>using namespace std;const int N = 55, M = 50050;int f[N][M];int dp(int a, int b) {int &v = f[a][b];if (v != -1) return v;if (!a) return v = b % 2;if (b == 1) return dp(a + 1, 0);if (a && !dp(a-1,b)) return v = 1;if (b && !dp(a,b-1)) return v = 1;if (a >= 2 && !dp(a-2, b + (b ? 3 : 2))) return v = 1;if (a && b && !dp(a - 1, b + 1)) return v = 1;return v = 0;
}int main() {memset(f, -1, sizeof f);int T;scanf("%d", &T);while (T--) {int n;scanf("%d", &n);int a = 0, b = 0;for (int i = 0; i < n; ++i) {int x;scanf("%d", &x);if (x == 1) a++;else b += b ? x + 1 : x;}if (dp(a, b)) puts("YES");else puts("NO");}return 0;
}

题目3:1322取石子游戏

C++代码如下,

#include <cstdio>using namespace std;const int N = 1010;int n;
int a[N];
int l[N][N], r[N][N];int main() {int T;scanf("%d", &T);while (T--) {scanf("%d", &n);for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);for (int len = 1; len <= n; ++len) {for (int i = 1; i + len - 1 <= n; ++i) {int j = i + len - 1;if (len == 1) l[i][j] = r[i][j] = a[i];else {int L = l[i][j-1], R = r[i][j-1], X = a[j];if (R == X) l[i][j] = 0;else if (X < L && X < R || X > L && X > R) l[i][j] = X;else if (L > R) l[i][j] = X - 1;else l[i][j] = X + 1;L = l[i+1][j], R =  r[i+1][j], X = a[i];if (L == X ) r[i][j] = 0;else if (X < L && X < R || X > L && X > R) r[i][j] = X;else if (R > L) r[i][j] = X - 1;else r[i][j] = X + 1;}}}if (n == 1) puts("1");else printf("%d\n", l[2][n] != a[1]);}return 0;
}

这篇关于acwing算法提高之数学知识--博弈论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958983

相关文章

LeetCode算法题:11. 盛最多水的容器(Java)(双指针问题总结)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 提示: n == height.length2 <= n <= 10^50 <= height[i] <= 10^4 解题思路: 定义两个指针

算法提高之香甜的黄油

算法提高之香甜的黄油 核心思想:spfa 遍历所有点作为起点 spfa求最短路最后求和返回 求最小 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 810,M = 3000,INF = 0x3f3f3f3f;int n,p,m;int id[N];int

算法学习(7)-树

目录 开启“树”之旅 二叉树 堆--优先队列 并查集 开启“树”之旅         是不是很像一棵倒挂的树?也就是说它是根朝上, 而叶子朝下的。不像?哈哈,来看看下面的图你就会觉得像啦。         你可能会间: 树和图有什么区别?这个称之为树的东西和无向图差不多嘛。不要着急,继续往下看。树其实就是不包含回路的连通无向阳。你可能还是无法理解这其中的差异, 下面举个例

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中,拼多多以其独特的团购模式吸引了众多消费者的目光。然而,随着市场竞争的加剧和消费者需求的多样化,一些商家发现自家店铺的流量持续低迷,销售业绩难以突破。面对这样的挑战,如何有效提升拼多多店铺的客流量成为摆在商家面前的紧迫课题。   一、产品优化与创新   商家应定期分析市场趋势和消费者偏好,对现有产品线进行审视和优化。同时,引入新品以刺激消费者兴趣,增加曝光度。确保产品图片

图像几何变换(缩放、旋转)中的插值算法

转载地址:http://blog.itpub.net/10752043/viewspace-996696/ 此篇文章讲了在图像变换中基本的插值算法(最临近、双线性和 三次卷积法) 实践已证明,插值算法对于缩放比例较小的情况是完全可以接受的,令人信服的。一般的,缩小0.5倍以上或放大3.0倍以下,对任何图像都是可以接受的。   最邻近插值(近邻取样法):   最

笔试题--链表的反序算法

今天遇到一道笔试题,实现链表的反序,查了一些资料记录于此 例如:一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。最容易想到的方法遍历一遍链表,利用一个辅助指针, 存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下: struct linka { int data; linka* next

java算法实现之--输入一个英文句子,翻转句子中的单词顺序,但单词内字符的顺序不变

此题经常在笔试题中遇到,故特记录于此 public class Test {public static void main(String[] args) {String into = "I am a student";System.out.println(reverse(into));}public static String reverse(String into){String[] spli

常规的排序算法汇总

前言 排序算法,在职业生涯中,时常有用到,不论是在项目中,还是在面试中。 在这里记录一下常用的排序算法,也给自己插个眼。 排序算法分为:冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序、基数排序、归并排序八大排序。 时间复杂度和空间复杂度 排序方法时间复杂度(平均)时间复杂度(最好)时间复杂度(最坏)空间复杂度稳定性冒泡排序O(n^2)O(n^2)O(n)O(1)稳定插入排序O(n^

AI作画算法详解:原理、应用与未来发展

随着人工智能技术的不断发展,AI作画逐渐成为了一个热门话题。AI作画,即利用人工智能算法生成绘画作品,不仅仅是技术的展示,更是艺术与科技结合的创新体现。本文将深入探讨AI作画的核心算法原理,并通过实例帮助读者更好地理解和掌握这一技术。 文章最后,给大家推荐中文版AI绘画软件。 一、AI作画的基本原理 AI作画的核心算法主要有两种:生成对抗网络(GANs)和变分自编码器(VAEs)。这两种算法

《算法导论》学习笔记Chapter11散列表

散列表最重要的是散列函数的选择,一个好的散列函数应满足简单均匀散列假设特点:每个关键字都被等可能的散列到m个槽位中的任何一个,并与其它关键字已散列到哪个槽位无关。 遗憾的是上述条件很难检测到是否满足,因为很少能知道关键字散列所满足的概率分布,且各关键字可能并不是完全独立的。 实际中,可应用启发式方法构造性能好的散列函数。设计过程中,充分利用关键字分布的有用信息。 “除法散列”是一种较好的方法