ZOJ 3791 An easy game DP+组合数
2024-09-07 03:03:16
给定两个01序列,每次操作可以任意改变其中的m个数字 0变 1 1 变 0,正好要变化k次,问有多少种变法
dp模型为dp[i][j],表示进行到第i次变化,A,B序列有j个不同的 变法总和。
循环k次,每次针对m,向那j个不同 分1-j个即可,不过要用到组合数,因为对每个数操作不同都不一样
最后结果就是 dp[k][0]
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
LL dp[][];
LL c[][];
int n,m,k,len;
char s1[],s2[];
const LL M=+;
void init()
{
c[][]=;
for (int i=;i<;i++){
c[i][]=;
for (int j=;j<=i;j++){
c[i][j]=c[i-][j-]+c[i-][j];
c[i][j]%=M;
}
}
}
int main()
{
init();
while (scanf("%d%d%d",&n,&k,&m)!=EOF)
{
scanf("%s%s",s1,s2);
int a=;
for (int i=;i<n;i++){
if (s1[i]!=s2[i]){
a++;
}
}
memset(dp,,sizeof dp);
dp[][a]=;
for (int i=;i<k;i++){
for (int j=;j<=n;j++){
if (dp[i][j]){
for (int q=;q<=min(m,j);q++){
int sta=j+m-*q;
dp[i+][sta]+=c[j][q]*c[n-j][m-q]%M*dp[i][j]%M;
if (dp[i+][sta]>=M) dp[i+][sta]%=M;
}
}
}
}
printf("%lld\n",dp[k][]);
}
return ;
}
最新文章
- iOS单元格高度计算
- BFS与DFS
- javascript数组浅谈3
- 神奇的main方法详解
- JS 事件练习
- File和URL的getPath()方法区别
- Linux-C程序的存储空间布局
- 【Tsinghua OJ】范围查询(Range)问题
- 实例讲解如何在Delphi中动态创建dxBarManager内容
- Java集合类之HashMap
- ADO.NET之使用DataGridView控件显示从服务器上获取的数据
- FineUI页面布局
- Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
- jexus部署webapi或mvc报错处理
- Python之路1-变量、数据类型、循环语法
- QMessageBox对话框
- C语言中getch()、getche()和getchar()
- undefined reference问题总结
- Cpp读文件、CString转String、String转CString
- Spark学习之路 (四)Spark的广播变量和累加器
热门文章
- css选择器优先级排序
- Python学习笔记之基础篇(四)列表与元祖
- Spring mvc mybatis 查询结果缺少字段 解决方法
- 博途V13 仿真S7-300PLC 与HMI 的以太网通讯。实现简单功能 HMI 型号是TP900
- #define 和 const
- swift4之String与NSString的区别与使用
- Android 四种加载方式详解(standard singleTop singleTask singleInstance) .
- Ajax--XMLHttpRequest的使用
- JVM中 Class 文件分析
- 前端学习笔记系列一:12 js中获取时间new date()的用法