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. java、ajax 跨域请求解决方案('Access-Control-Allow-Origin' header is present on the requested resource. Origin '请求源' is therefore not allowed access.)

      1.情景展示 ajax调取java服务器请求报错 报错信息如下: 'Access-Control-Allow-Origin' header is present on the requested ...

  2. 【redis】分布式锁实现,与分布式定时任务

    如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 写在前面 redis辣么多数据结构,这么多命令,具体一点,都可以应用在什么场景呢?用来解决什么具体的问 ...

  3. Docker 镜像/容器操作命令

    一.镜像操作   1.拉取镜像 # docker pull tomcat # docker pull tomcat:8.0.21-jre8 # docker pull 192.168.220.150: ...

  4. 为某金融企业开发团队分享DevOps Server流水线使用经验

    http://www.cnblogs.com/danzhang/  DevOps MVP 张洪君

  5. Axure入门

    一.Axure介绍 1.1 原型和Axure是什么? 原型是什么? 简单的说就是产品设计成形之前的一个简单框架,对网站来讲,就是将页面模块.元素进行粗放式的排版和布局,深入一些,还会加入一些交互性的元 ...

  6. SQL Inserted 触发器游标结合实例

    SqlServer的Inserted可能是一个集合而不是一条数据,如果有如果需要对插入数据进行处理,有时需要用游标逐条处理 FROM inserted) --插入和更新 declare cur cur ...

  7. Prometheus 安装Alertmanager集成

    Prometheus 安装Alertmanager集成 # 下载地址 地址1:https://prometheus.io/download/ 地址2:https://github.com/promet ...

  8. 【ELK】elasticsearch使用bulk 导入批量的数据集文件报错:Validation Failed: 1: no requests added

    执行命令如下: curl -XPOST http://192.168.6.16:9200/my_new_index/user/_bulk?pretty --data-binary @/cjf/es/e ...

  9. 有趣的css图形实现

    css通过 border .border-radius .transform,实现各种图形. <!DOCTYPE html> <html lang="en"> ...

  10. digital clock based C

    /********************************** * Name : timeDisplay.cpp * Purpose: Display digital clock accord ...