当前位置: 首页 > article >正文

题目:Wangzyy的卡牌游戏

登录 - XYOJ


思路:

        使用动态规划,设dp[n]表示当前数字之和模三等于0的组合数。

        状态转移方程:因为是模三,所以和的可能就只有0、1、2。等号右边的f和dp都表示当前一轮模三等于k的组合数。以第一行为例:等号右边表示 j转移到0的方案数+(当前j方案数*反正面等于0的个数)。ps:j转移到0表示  上一轮牌和为j到本轮的牌模三为0

			f[(j + 0) % 3] = (f[(j + 0) % 3] + dp[j] * c[0]) % MOD;
			f[(j + 1) % 3] = (f[(j + 1) % 3] + dp[j] * c[1]) % MOD;
			f[(j + 2) % 3] = (f[(j + 2) % 3] + dp[j] * c[2]) % MOD;

代码:

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

const int N = 1e5+9, MOD = 1e9 + 7;
int dp[3] = {1, 0, 0}; // dp[i]:和模三为i的组合数。初始状态,0张牌,和模三为0,
int a[N], b[N];


int main(){
	int n;cin >> n;
	for(int i = 0; i < n; i++)cin >> a[i];
	for(int i = 0; i < n; i++)cin >> b[i];
	
	for(int i = 0; i < n; i++){
		int a_mod = a[i] % 3;
		int b_mod = b[i] % 3;
		
		int c[3] = {0, 0, 0};  // 第i张的牌正和反共有几个模三分别等于0、1、2
		
		c[a_mod] += 1;
		c[b_mod] += 1;
		
		int f[3] = {0, 0, 0};  // 用作滑动数组,当前表示上一轮牌和模三等于0、1、2的组合数
		
		for(int j = 0; j < 3; j++){
            // dp[j]:上一轮牌和模三为j的组合数。 
			f[(j + 0) % 3] = (f[(j + 0) % 3] + dp[j] * c[0]) % MOD;
			f[(j + 1) % 3] = (f[(j + 1) % 3] + dp[j] * c[1]) % MOD;
			f[(j + 2) % 3] = (f[(j + 2) % 3] + dp[j] * c[2]) % MOD;
		}
		
		for(int j = 0; j < 3; j++)dp[j] = f[j];  // 到此dp和f都表示本轮牌和模三为j的组合数
	}
	
	cout << dp[0] << '\n'; 
	
	
	return 0;
} 

知识点:动态规划


http://www.kler.cn/a/387711.html

相关文章:

  • Qwen2 系列大型语言模型
  • 【C++】详细介绍模版进阶,细节满满
  • 中兴光猫修改SN,MAC,修改地区,异地注册,改桥接,路由拨号
  • 图像处理自动渲染代码
  • Mac如何实现最简单的随时监测实时运行状态的方法
  • npm i忽略依赖冲突
  • 前端入门一之CSS知识详解
  • SpringBoot续+SpringMVC入门介绍
  • 二开CS—上线流量特征shellcode生成修改模板修改反编译打包
  • [QUIC] QUIC Frames
  • (C++回溯算法)微信小程序“开局托儿所”游戏
  • 图为科技与广东省北斗移动物联网产业研究院达成战略合作
  • mp3格式音频怎么做成二维码?扫码获取音频文件的制作方法
  • MySQL:客户端工具创建数据库
  • 25浙江省考-28天学行测-Day1
  • Python爬虫基础-正则表达式!
  • Redis4:Redis的Java客户端
  • 计算机网络socket编程(1)_UDP网络编程实现echo server
  • Golang--反射
  • 在Laravel中,最优的自定义验证规则方法
  • k8s和docker的区别及各自的应用场景
  • 快速解锁Rust Slice特性
  • PMP–一、二、三模、冲刺–分类–7.成本管理–技巧–挣值分析
  • 【LuatOS】修改LuatOS源码为PC模拟器添加高精度时间戳库timeplus
  • 十五、Linux线程(二)
  • 使用批处理脚本批量删除Maven无效依赖