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. oracle--介质恢复和实例恢复的基本概念

    1.概念 REDO LOG是Oracle为确保已经提交的事务不会丢失而建立的一个机制.实际上REDO LOG的存在是为两种场景准备的,一种我们称之为实例恢复(INSTANCE RECOVERY),一种 ...

  2. 一、WebAPI自定义过滤器的使用

    一.WebAPI自定义过滤器的使用 1.注册过滤器 using System.Web.Http; using KYINT.WebAPIService.Handler; namespace KYINT. ...

  3. .NET Core:过滤器

    过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码.功能上更贴合业务的使用过滤器. 在Startup中的ConfigureServices方 ...

  4. Nginx 变量参数

    $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...

  5. sublime-text-3-build-3207 破解+注册码

    按照以下步骤依次进行 打开 https://hexed.it/ 单机 "Open file" 并选择 "sublime_text.exe" 可执行文件. 转到 ...

  6. Ext.Net GridPanel (属性|方法|配置|详细介绍)

    1.Ext.NET ---- GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn ...

  7. C/C++ 随笔目录

    [1]基础部分 (1)宏定义 <assert> <offset宏> <#pragma once> <宏定义学习> <预处理语句> <# ...

  8. selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)

    一.问题使用selenium自动化测试爬取知乎的时候出现了:错误代码10001:请求异常请升级客户端后重新尝试,这个错误的产生是由于知乎可以检测selenium自动化测试的脚本,因此可以阻止selen ...

  9. VMWare 下安装 Windows XP

    准备工作 安装VMware 我这里安装的是 VMware-workstation-full-12.1.1-3770994.exe 下载Windows XP with SP3 从网上下载的MSDN版本X ...

  10. 设置a标签,实现点击跳转页面的两种效果

    设置a标签,实现点击跳转页面 这个问题,主要是设置a标签的属性target,下面对target属性进行描述: 跳转在同一个窗口 1,target="_self",  它使得目标文档 ...