题目链接:点击查看

题目大意:给出一个长度为 n 的 01 字符串表示 n 个灯泡的状态,1 为点亮,0 为熄灭,现在需要进行 k 轮操作,每轮操作可以选择恰好 m 个位置,将灯泡的状态置反,现在给出初始状态和终止状态,问有多少种方案可以到达

题目分析:首先不难看出,如果对一个相同的位置操作偶数次,不会改变其状态,只有操作次数为奇数时才会改变其状态,那么设计二维 dp ,dp[ i ][ j ] 代表的是到达第 i 轮操作时,共有 j 次操作次数为奇数的方案数,转移的话,就是枚举 k ,代表的是当前选择 k 个位置从偶数变为奇数,因为一共需要操作 m 次,所以对应的需要将 m - k 个位置从奇数变为偶数,因为初始时有 j 次操作为奇数,n - j 次操作为偶数,所以满足上述 k 的方案数为 C[ j ][ k ] * C[ n - j ][ m - k ] ,简单的组合数学,然后转移就好了

有点没搞清楚的就是初始话,设初始状态和终止状态共有 num 个位置不同,则需要给 dp[ 0 ][ num ] 初始为 1 ,答案是 dp[ k ][ 0 ] ,而不能是 dp[ 0 ][ 0 ] = 0 ,然后输出 dp[ k ][ num ]

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;const int mod=998244353;LL C[N][N],dp[N][N];char s1[N],s2[N];void init()//预处理组合数
{C[0][0]=1;for(int i=1;i<N;i++){C[i][0]=1;for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int w;cin>>w;while(w--){memset(dp,0,sizeof(dp));int n,m,k;scanf("%d%d%d",&n,&k,&m);scanf("%s%s",s1,s2);int num=0;for(int i=0;i<n;i++)num+=(s1[i]!=s2[i]);dp[0][num]=1;for(int i=0;i<k;i++)//迭代k次 for(int j=0;j<=n;j++)//有j个位置操作了奇数次 for(int k=0;k<=m;k++)//有k个位置由奇数次变为了偶数次 if(j>=k&&n-j>=m-k)dp[i+1][j-k+m-k]=(dp[i+1][j-k+m-k]+dp[i][j]*C[j][k]%mod*C[n-j][m-k])%mod;printf("%lld\n",dp[k][0]);}return 0;
}

ZOJ - 4114 Flipping Game(dp+组合数学)相关推荐

  1. 2019山东省赛B - Flipping Game ZOJ - 4114 题解

    题意: 初始有n个灯泡,灯泡状态是0和1,.现在有k轮操作,每次改变且仅改变m个的灯的状态,给定n盏灯的初始状态的最终状态,求有多少种解决改变灯的方案满足可以满足题目条件. 思路: 开始写的时候以为是 ...

  2. CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)

    题目链接:点击查看 题目大意:给出一个 01 字符串,规定求值的过程如下: 每次选择末尾的两个数字: 如果为 0 0 ,那么替换成一个 1 否则替换成一个 0 循环往复,直至只剩一个数字位置,剩下的数 ...

  3. 【BZOJ 3294】 3294: [Cqoi2011]放棋子 (DP+组合数学+容斥原理)

    3294: [Cqoi2011]放棋子 Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数 ...

  4. ARC 128D - Neq Neq(dp+组合数学+思维)

    链接 题意: 给出你一个长度为n的序列,你可以对其操作使得这个序列发生变化,问一共有多少种? 对于连续的i-1,i,i+1,这三个数如果满足 ai−1!=aia_{i-1}!=a_{i}ai−1​!= ...

  5. ZOJ 1425 Crossed Matchings DP LCS

    ZOJ 1425 Crossed Matchings 题目描述: 题目链接:ZOJ 1425 Crossed Matchings 题目大意: 上下2组数据,找一个满足条件的最大匹配数.匹配条件是任意一 ...

  6. zoj 3812 状压dp

    转载:http://blog.csdn.net/qian99/article/details/39138329 题意:给出n个物品,每个物品有两种属性Wi,Ti,有q组查询,每组查询要求在n个物品中选 ...

  7. zoj 3351 Bloodsucker(概率 dp)

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 dp[i]表示现在存在i个吸血鬼要达成目标(全为吸血鬼)天数的数学 ...

  8. ZOJ 3471 压缩状态DP

    这个问题要看状态怎么想,第一种直接的想法是1代表未合并,状态就从1111111 转移到 带有1个0,然后带有两个0, 但是这样子编程非常不直观.换一种思路,0代表未合并,但是我可以先合并前几个,就是说 ...

  9. 2021牛客多校5 - Double Strings(dp+组合数学)

    题目链接:点击查看 题目大意:给出两个字符串 sss 和 ttt,要求 "一段相同的前缀" + "一个不同的字符(满足s[i]<t[j])"+ " ...

最新文章

  1. 尤雨溪携手字节前端专家,畅聊 Vue 3.0 前端技术新趋势
  2. MySQL:数据操作
  3. ES6新特性之class类的基本语法
  4. Java课程设计---项目数据库设计(含实体类)
  5. 【MFC】遍历文件夹及其子文件夹
  6. 大数据学习线路_[个人经验篇]大数据学习线路前导篇
  7. i7 3960x支持服务器内存吗,酷睿i7 3960X支持多大内存
  8. arp扫描工具_ARP扫描与ARP欺骗--Python的Scapy/Kamene模块学习之路
  9. 对uni.request()二次封装,封装$myRequest方法并挂载到全局
  10. ecg 幅度_用ECG和PPG测血压靠谱吗?有什么比较好的算法?
  11. MySQL数据库管理命令和远程管理问题
  12. EmguCV方形答题卡识别
  13. 跳棋java_用java画跳棋棋盘
  14. 【问链财经-EOS公开课】 第十八课 史上最全EOS 资源汇总
  15. java基金管理系统,基于JSP(java)基金管理系统的设计和实现 - 图文
  16. 基于JAVA幼儿园综合管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
  17. 银行贷款客户拉新活动分析——数据分析项目实战
  18. 【小工具】极客时间GitChat专栏下载脚本
  19. 【Python】PEP8规范
  20. 服务器硬盘掉线解决过程分析

热门文章

  1. c语言怎么在服务器端查询进程列表,C语言 在服务器端识别客户端的方法
  2. 认识微服务-SpringCloud
  3. rdb和aof优势劣势
  4. MyBatis 架构分层与模块划分
  5. Redis 到底有多快?
  6. 从证书中导出公钥并存放到项目中
  7. InputStreamReader介绍代码实现
  8. FastDFS在项目中的应用
  9. SocketIO-nio
  10. InfluxDB基本使用说明