CF1081C-Colorful Bricks-(dp||组合数)
http://codeforces.com/problemset/problem/1081/C
题意:有n个排成一行板块,有m种颜色,要让这些板块有k对相邻板块不同颜色,有多少种涂色方法?
比如样例2,3块板,2种颜色,1对不同。有4种涂法。
1.黄+绿+绿
2.黄+黄+绿
3.绿+黄+黄
4.绿+绿+黄
为什么是相邻不同?百度翻译讲得含糊其辞。从样例可以推断出来如果第1种情况中,第一个黄 越过第二个绿 直接与第三个绿构成一种情况,则样例不成立。
解题:
dp[i][j]表示长度为i的板块中有j个不同色的情况。
对于第1个板块,肯定是没有不同色的,1个哪来的不同?第1个板块的涂色方法有m种,这应该可以理解,每种颜色都可以涂在第1块上,暂时不考虑其他的东西。
举例:有4块板,3种颜色(用字母a,b,c表示),要2种不同色。
对于第1个板块,有3种情况
a * * *
b * * *
c * * *
本例子要求2个相邻不同色
则对于第2个板块,要创造出1个相邻不同色,则第二个板块要和前面的板块不同色,前面的板块占m种中的1种,则与它不同色的情况有m-1种。dp[i][j] = dp[i-1][j-1] *(m-1)。比如现在的dp[2][1]=dp[1][0]*2=3*2=6;
a b * * a c * *
b a * * b c * *
c a * * c b * *
对于第3个板块,如果要再创造出1个相邻不同色,则dp[3][2]=dp[2][1]*2=6*2=12;
aba* abc* aca* acb*
bab* bac* bca* bcb*
cac* cab* cba* cbc*
对于第4个板块,2个相邻不同色已经够了,则不需要再创造相邻不同色了,按照上一种涂色方法继续涂就好。dp[i][j]=dp[i-1][j];
abaa abcc acaa acbb
babb bacc bcaa bcbb
cacc cabb cbaa cbcc
但是,如果第2块涂的时候不创造相邻不同色,则是这样,dp[i][j]=dp[i-1][j],dp[2][0]=dp[1][0]。
aa**
bb**
cc**
不创造相邻不同色是在已经有足够相邻不同色的情况下派上用场。
接下来第3块想创造1个相邻不同色则还是 dp[i][j]=dp[i-1][j-1]*(m-1)
aab* aac*
bba* bbc*
cca* ccb*
所以状态转移方程是
dp[i][j]=dp[i-1][j-1]*(m-1) + dp[i-1][j];
记得求模,随便模。
类似那些dp[1][1],dp[2][2]这种不可能存在的东西当作0处理就可以了,1块板1个不同???2块板2个不同???
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<map>
#include<string>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; ll n,m,k;
ll dp[][];
ll p=; int main()
{
while(scanf("%lld %lld %lld",&n,&m,&k)!=EOF)
{
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
dp[i][]=m;///没有不同则是全部板都是一种颜色,无论板多长
for(int i=;i<=n;i++)
for(int j=;j<=k;j++)
dp[i][j] = ( dp[i-][j-]*(m-)%p + dp[i-][j] )%p;
printf("%lld\n",dp[n][k]);
}
return ;
}
dp解法
组合数解法:
k个相邻不同色,至少需要k+1个板块来完成。
对于第1个板块,有m种可能。
剩下还有n-1个板块,在拿出k个板块来和第1个一起创造k个相邻不同色,任取k个,C( n-1,k )。
对于后面这所有的板块,有2种情况。
1.属于k个板块之一,则要与上一个板块不同,才能创造相邻不同色,它有(m-1)种涂色方法。
2.不属于k个板块之一,那么要与上一个板块相同,不变!不需要乘什么乱七八糟的东西。
公式: m * C( n-1,k ) * (m-1)^k
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<map>
#include<string>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; ll n,m,k;
ll p=;
ll C[][];///C[i][j]表示从i个里拿j个
void init()
{
memset(C,,sizeof(C));
for(int i=;i<;i++)
C[i][]=C[i][i]=;
for(int i=;i<;i++)
for(int j=;j<i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%p;///组合恒等式
/*
for(int i=0;i<=10;i++)
{
for(int j=0;j<=i;j++)
printf("%5lld",C[i][j]);
printf("\n");
}*/
} int main()
{
init();
while(scanf("%lld %lld %lld",&n,&m,&k)!=EOF)
{
ll ans=m*C[n-][k]%p;
for(int i=;i<=k;i++)
ans=ans*(m-)%p;
printf("%lld\n",ans);
}
return ;
}
组合数解法
CF1081C-Colorful Bricks-(dp||组合数)的更多相关文章
- CF1081C Colorful Bricks
思路: dp[i][j]表示到第i个砖块为止共计有j个砖块和它左边的砖块颜色不同. 实现: #include <bits/stdc++.h> using namespace std; ty ...
- Avito Cool Challenge 2018:C. Colorful Bricks
C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色 ...
- Avito Cool Challenge 2018 C. Colorful Bricks 【排列组合】
传送门:http://codeforces.com/contest/1081/problem/C C. Colorful Bricks time limit per test 2 seconds me ...
- noj 2033 一页书的书 [ dp + 组合数 ]
传送门 一页书的书 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 53 测试通过 : 1 ...
- 【区间dp+组合数+数学期望】Expression
https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/I [题意] 给定n个操作数和n-1个操作符,组成一个数学式子.每次可以选择两个相 ...
- Colorful Bricks CodeForces - 1081C ( 组合数学 或 DP )
On his free time, Chouti likes doing some housework. He has got one new task, paint some bricks in t ...
- LightOJ - 1246 Colorful Board(DP+组合数)
http://lightoj.com/volume_showproblem.php?problem=1246 题意 有个(M+1)*(N+1)的棋盘,用k种颜色给它涂色,要求曼哈顿距离为奇数的格子之间 ...
- Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学
https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...
- hdu 3944 DP? 组合数取模(Lucas定理+预处理+帕斯卡公式优化)
DP? Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0 ...
- Contest 20140708 testB dp 组合数
testB 输入文件: testB.in 输出文件testB.out 时限3000ms 问题描述: 定义这样一个序列(a1,b1),(a2,b2),…,(ak,bk)如果这个序列是方序列的话必须满足 ...
随机推荐
- Redis数据结构及常用命令(草稿)
通用命令 数据类型 string 字符 list 列表 set 集合 zset 有序集合 hash 散列(字典中的字典) bitmap 位图 hyperloglog
- java web开发入门五(ssh整合)基于intellig idea
SSH整合 1.引入jar包 Struts 核心jar Hibernate 核心jar Spring Core 核心功能 Web 对web模块支持 Aop aop支持 Orm 对hiber ...
- spring boot开启gzip
Web服务使用Spring Boot2X且运行在Tomcat或者Jetty中,支持gzip压缩可以 修改配置文件 application.properties server.compression.e ...
- sync 异步编程
using System; using System.Net; using System.Threading; using System.Threading.Tasks; namespace Cons ...
- Spring Boot Cache使用与整合
Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Caffeine.Ehcache等),但本身不直接提供缓存功能的实现.它支持注解方式使用缓存,非常方便. SpringBoot在a ...
- Qt 编写串口调试助手
一.成品图展示 成品图如下所示: 二.串口通讯步骤 1.在工程文件(.pro)中添加串口通信相关运行库:QT += serialport 2.在头文件中添加: #include <QSerial ...
- Linux 安装Redis4.0.8【yum安装】
.下载yum源 yum install epel-release2.安装redisyum install redis3.启动redis # 启动redis service redis start # ...
- POSIX 正则表达式 BRE与ERE的差异
BRE,标准正则表达式,basic regular expressions ERE,扩展正则表达式,Extended Regular Expressions POSIX 正则表达式 传统上,POSIX ...
- C#操作XML文档
Note: '=> ' 表示返回值 参考资料:请点击这里! 1:创建Xml文档 2:写Xml文档(必须保证有根元素) XmlDocument Xd (实例化一个对象) CreateXmlDecl ...
- Django2.0版本以上与pymsql 不匹配问题以及解决方法
Django2.0版本以上与pymsql 不匹配问题以及解决方法 Django 2.0 以上 如果使用pymysql0.93,需要一下两步操作: # 1 第一次报错信息: File "D:\ ...