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||组合数)的更多相关文章

  1. CF1081C Colorful Bricks

    思路: dp[i][j]表示到第i个砖块为止共计有j个砖块和它左边的砖块颜色不同. 实现: #include <bits/stdc++.h> using namespace std; ty ...

  2. Avito Cool Challenge 2018:C. Colorful Bricks

    C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色 ...

  3. Avito Cool Challenge 2018 C. Colorful Bricks 【排列组合】

    传送门:http://codeforces.com/contest/1081/problem/C C. Colorful Bricks time limit per test 2 seconds me ...

  4. noj 2033 一页书的书 [ dp + 组合数 ]

    传送门 一页书的书 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 53            测试通过 : 1 ...

  5. 【区间dp+组合数+数学期望】Expression

    https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/I [题意] 给定n个操作数和n-1个操作符,组成一个数学式子.每次可以选择两个相 ...

  6. 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 ...

  7. LightOJ - 1246 Colorful Board(DP+组合数)

    http://lightoj.com/volume_showproblem.php?problem=1246 题意 有个(M+1)*(N+1)的棋盘,用k种颜色给它涂色,要求曼哈顿距离为奇数的格子之间 ...

  8. Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学

    https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...

  9. hdu 3944 DP? 组合数取模(Lucas定理+预处理+帕斯卡公式优化)

    DP? Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0 ...

  10. Contest 20140708 testB dp 组合数

    testB 输入文件: testB.in  输出文件testB.out 时限3000ms 问题描述: 定义这样一个序列(a1,b1),(a2,b2),…,(ak,bk)如果这个序列是方序列的话必须满足 ...

随机推荐

  1. 用户增长模型AARRR模型

    用户增长模型AARRR模型

  2. docker搭建php环境

    前言 本文根据参考文章,自己动手试了搭建PHP环境,对里面的Dockerfile的编写 做了最新的修改,以此记录,完整代码查看传送门 说明: 镜像下载过慢,可使用国内镜像加速,具体可自行查询 根据此方 ...

  3. 非替代品,MongoDB与MySQL对比分析

    IT168 评论]对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数 ...

  4. 修!咻咻!团队Beta作业博客汇总

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...

  5. 汇编语言01 - 打印 "Hello World!"

    Hello World! 源代码 data segment msg db "Hello World!$";定义名称为msg的字符串,最后加上$,表示字符串结束 data ends ...

  6. CSS之flex布局和边框阴影

    flex布局 main axis:主轴:cross axis:交叉轴 容器的子元素自动成为容器成员,成为flex 项目(item) flex容器属性 flex-direction ​ 该属性决定主轴的 ...

  7. 基于FlexBox的无约束自适应

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11972664.html,多谢,=.=~ 一.背景描述   对于通用型带过滤条件的列表查询项目中, ...

  8. 【题解】L 国的战斗续之多路出击 [P2129]

    [题解]L 国的战斗续之多路出击 [P2129] 传送门: \(L\) 国的战斗续之多路出击 \([P2129]\) [题目描述] 给出 \(n\) 个坐标,\(m\) 个指令,指令处理顺序应是从后往 ...

  9. Docker File

  10. Redis(七)持久化(Persistence)

    前言 前文中介绍到Redis时内存的K-V数据结构存储服务器.Redis的高性能原因之一在于其读写数据都是在内存中进行.它的架构实现方式决定了Redis的数据存储具有不可靠性,易丢失,因为RAM内存在 ...