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)如果这个序列是方序列的话必须满足 ...
随机推荐
- oracle--介质恢复和实例恢复的基本概念
1.概念 REDO LOG是Oracle为确保已经提交的事务不会丢失而建立的一个机制.实际上REDO LOG的存在是为两种场景准备的,一种我们称之为实例恢复(INSTANCE RECOVERY),一种 ...
- 一、WebAPI自定义过滤器的使用
一.WebAPI自定义过滤器的使用 1.注册过滤器 using System.Web.Http; using KYINT.WebAPIService.Handler; namespace KYINT. ...
- .NET Core:过滤器
过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码.功能上更贴合业务的使用过滤器. 在Startup中的ConfigureServices方 ...
- Nginx 变量参数
$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...
- sublime-text-3-build-3207 破解+注册码
按照以下步骤依次进行 打开 https://hexed.it/ 单机 "Open file" 并选择 "sublime_text.exe" 可执行文件. 转到 ...
- Ext.Net GridPanel (属性|方法|配置|详细介绍)
1.Ext.NET ---- GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn ...
- C/C++ 随笔目录
[1]基础部分 (1)宏定义 <assert> <offset宏> <#pragma once> <宏定义学习> <预处理语句> <# ...
- selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)
一.问题使用selenium自动化测试爬取知乎的时候出现了:错误代码10001:请求异常请升级客户端后重新尝试,这个错误的产生是由于知乎可以检测selenium自动化测试的脚本,因此可以阻止selen ...
- VMWare 下安装 Windows XP
准备工作 安装VMware 我这里安装的是 VMware-workstation-full-12.1.1-3770994.exe 下载Windows XP with SP3 从网上下载的MSDN版本X ...
- 设置a标签,实现点击跳转页面的两种效果
设置a标签,实现点击跳转页面 这个问题,主要是设置a标签的属性target,下面对target属性进行描述: 跳转在同一个窗口 1,target="_self", 它使得目标文档 ...