T1 数数

【问题描述】

fadbec 很善于数数,⽐如他会数将 a 个红球,b 个黄球,c 个蓝球,d 个绿球排成⼀列,任意相邻不同⾊的数⽬。 现在 R 君不知道 fadbec 数的对不对,想让你也算⼀算。 由于数字⽐较⼤,所以请输出除以 109 + 7 的余数。

【输入格式】

⼀⾏四个正整数 a,b,c,d。

【输出格式】

输出包含⼀个整数,表⽰答案。

【样例输入 1】

1 1 1 2

【样例输出 1】

36

【数据规模及约定】

对于前 30% 的数据,1 ≤ a,b,c,d ≤ 3。 对于前 100% 的数据,1 ≤ a,b,c,d ≤ 30。

这个题纯用组合数学是比较麻烦的,因为插入之后或许原先同种颜色相邻的情况中间插入新颜色,那种情况就合法了,所以不好推。

但是看到这个题的数据范围我们可以想到高维DPqwq。。。。

DP的话每次放入的话可以一个一个地考虑,所以比较方便。。。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; typedef long long LL;
int a,b,c,d;
const LL mod = 1e9+7;
LL dp[35][35][35][35][4];
int sum(int a,int b,int c,int d,int k){
if(a+b+c+d == 0) return 1;
LL sum = 0;
for(int i = 0;i<4;i++){
if(k!=i) sum+= dp[a][b][c][d][i];
}
return sum%mod;
}
int main(){
//freopen("count.in","r",stdin);
//freopen("count.out","w",stdout);
cin >> a >> b >> c >> d;
int l = a+b+c+d;
for(int i=1;i<=l;i++){
for(int n1=0; n1<=a && n1<=i;n1++){
for(int n2=0;n2<=b && n1+n2 <= i;n2++){
for(int n3=0;n3<=c && n1+n2+n3 <= i;n3++){
int n4 = i-n1-n2-n3;
if(n1>0){
dp[n1][n2][n3][n4][0] = sum(n1-1,n2,n3,n4,0);
}
if(n2>0){
dp[n1][n2][n3][n4][1] = sum(n1,n2-1,n3,n4,1);
}
if(n3>0){
dp[n1][n2][n3][n4][2] = sum(n1,n2,n3-1,n4,2);
}
if(n4>0){
dp[n1][n2][n3][n4][3] = sum(n1,n2,n3,n4-1,3);
}
}
}
}
}
LL ans = sum(a,b,c,d,-1);
cout<<ans<<endl;
return 0;
}

数数(高维DP)的更多相关文章

  1. 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 682  Solved: 364 Description 我们称一 ...

  2. BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]

    3530: [Sdoi2014]数数 题意:\(\le N\)的不含模式串的数字有多少个,\(n=|N| \le 1200\) 考虑数位DP 对于长度\(\le n\)的,普通套路DP\(g[i][j ...

  3. BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP

    BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...

  4. BZOJ_1026_[SCOI2009]windy数_数位DP

    BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...

  5. [SDOI2014]数数 --- AC自动机 + 数位DP

    [SDOI2014]数数 题目描述: 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串. 例如当S=(22,333,0233)时,233是幸运数,2333 ...

  6. 【Foreign】数数 [打表][DP]

    数数 Time Limit: 10 Sec  Memory Limit: 128 MB Description Input 仅一行两个整数L,R Output 仅一行一个整数表示答案. Sample ...

  7. [Sdoi2014]数数[数位dp+AC自动机]

    3530: [Sdoi2014]数数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 834  Solved: 434[Submit][Status][ ...

  8. windy数(简单数位DP)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6306  Solved: 2810[Submit][Sta ...

  9. bzoj 3530: [Sdoi2014]数数 数位dp

    题目 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运数. ...

随机推荐

  1. Django 使用体会

    最近急于赶项目,少有更新博文.如今项目大致不那么赶了,终于可以在晚上码字码文章,而不是码代码了. 从开始使用Django开发到现在, 也已经有大半年了.公司的项目也是逐步地加功能,加模块,一步步完善设 ...

  2. win10 wsl安装 命令行

    用于一些精简版没有商店的安装方法 开启"Windows Subsystem for Linux" 可选特性 打开`PowerShell`,运行下面指令: Enable-Window ...

  3. 如何查看Mysql服务器上的版本

    select version(); 1,mysql 的守护进程是mysqld [root@localhost ~]# service mysqld start 启动 MySQL: [确定] 你可以看看 ...

  4. Android开发实战之ViewPager的轮播

    在安卓开发的许多控件中,如果你没有使用过ViewPager,就不能算是一个安卓开发工程师,在本篇博文中,我会总结ViewPager的使用方法, 以及一些开发中的拓展.希望本篇博文对你的学习和工作有所帮 ...

  5. Android开发实战之拥有Material Design风格的侧滑布局

    在实现开发要求中,有需要会使用抽屉式布局,类似于QQ5.0的侧滑菜单,实现的方式有很多种,可以自定义控件,也可以使用第三方开源库. 同样的谷歌也推出了自己的侧滑组件——DrawLayout,使用方式也 ...

  6. 124. Binary Tree Maximum Path Sum (Tree; DFS)

    Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...

  7. 混合开发之iOS快速集成DSBridge

    DSBridge-IOS github:https://github.com/wendux/DSBridge-IOS 使用 Native 实现API 代理类 //JsApiTest.m @implem ...

  8. 要生成在[min,max]之间的随机整数,

    import java.util.Random; public class RandomTest { public static void main(String[] args) { int max= ...

  9. EZOJ #227

    传送门 分析 我们发现第一段数和最后一段数对答案的贡献系数为1/-1,其余为0/2/-2 而且对于相邻两段不能系数均非0 于是可以dp 代码 #include<iostream> #inc ...

  10. Linux网络配置之虚拟网卡的配置(ubuntu 16.04)

    关于图形界面的配置,我这里就不多介绍了,这个很简单.这里介绍的是如何通过修改配置文件来实现虚拟网卡. 首先介绍ubuntu(我这里使用的是ubuntu-16.04)下虚拟网卡的配置 1.先用ifcon ...