题目传送门(内部题91)


输入格式

  第一行一个正整数$N$,表示颜色种类数。
  第二行$N$个正整数$k[i],k[i]$表示第$i$种颜色的数量$(1\leqslant k[i]\leqslant 3)$。


输出格式

  一个整数,表示相同颜色的小球不相邻的方案数。


样例

样例输入1:

3
1 2 3

样例输出1:

10

样例输入2:

4
1 3 2 1

样例输出2:

96


数据范围与提示

输入的所有数字均为正整数。


题解

正解(组合数学$+$容斥原理$+$高精度计算$+$动态规划)好麻烦,我不会……

于是就想到了记忆化搜索……

考场上想的是一个$13$维的$DP$……

定义$dp[lst][res1][res2][res3][res4][res5][res6][res7][res8][res9][res10][res11][res12]$分别表示上一位是$lst$,小球$i$还有$res_i$个的方案数……

就为了比别人多骗十分……

再来考虑正解。

设$f[x][i][j][k]$分别上一次放的小球出现的次数为$x$,表示个数为$1$的小球有$i$个,个数为$2$的小球有$j$个,个数为$3$的小球有$k$个。

然后记忆话搜索就好了。

注意可能会爆$long\ long$,但是不会爆$\text{__}int128$。

数据范围中小球的个数可以到$4\sim 5$。

时间复杂度:$\Theta(13^3\times 3)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const long long mod=1e18;
int n;
int k[4];
__int128 dp[3][13][13][13];
__int128 dfs(int lst,int res1,int res2,int res3)
{
if(dp[lst][res1][res2][res3]!=-1)return dp[lst][res1][res2][res3];
dp[lst][res1][res2][res3]=0;
if(lst==0)
{
if(res1)dp[lst][res1][res2][res3]+=res1*dfs(0,res1-1,res2,res3);
if(res2)dp[lst][res1][res2][res3]+=res2*dfs(1,res1+1,res2-1,res3);
if(res3)dp[lst][res1][res2][res3]+=res3*dfs(2,res1,res2+1,res3-1);
}
if(lst==1)
{
if(res1>1)dp[lst][res1][res2][res3]+=(res1-1)*dfs(0,res1-1,res2,res3);
if(res2)dp[lst][res1][res2][res3]+=res2*dfs(1,res1+1,res2-1,res3);
if(res3)dp[lst][res1][res2][res3]+=res3*dfs(2,res1,res2+1,res3-1);
}
if(lst==2)
{
if(res1)dp[lst][res1][res2][res3]+=res1*dfs(0,res1-1,res2,res3);
if(res2>1)dp[lst][res1][res2][res3]+=(res2-1)*dfs(1,res1+1,res2-1,res3);
if(res3)dp[lst][res1][res2][res3]+=res3*dfs(2,res1,res2+1,res3-1);
}
return dp[lst][res1][res2][res3];
}
int main()
{
memset(dp,-1,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
k[x]++;
}
dp[0][0][0][0]=dp[1][0][0][0]=dp[2][0][0][0]=1;
dfs(0,k[1],k[2],k[3]);
if(dp[0][k[1]][k[2]][k[3]]>mod)printf("%lld",(long long)(dp[0][k[1]][k[2]][k[3]]/mod));
printf("%lld",(long long)(dp[0][k[1]][k[2]][k[3]]%mod));
return 0;
}

rp++

[CSP-S模拟测试]:彩球问题(记忆化搜索)的更多相关文章

  1. HDU 3779 Railroad(记忆化搜索)

    Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

  2. [CSP-S模拟测试]:集合合并(记忆化搜索)

    题目传送门(内部题133) 输入格式 第一行一个正整数$n$. 第二行$n$个正整数$a_i$,表示一开始有$S_i=\{a_i\}$ 输出格式 输出一个非负整数表示最大的收益之和 样例 样例输入: ...

  3. 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】

    Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...

  4. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

  5. HDU 4597 Play Game(记忆化搜索,深搜)

    题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...

  6. HDU-1428(记忆化搜索)

    Problem Description LL 最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU 校园呈方 ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)

    链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...

  8. FZU 2092 收集水晶(记忆化搜索)

    Problem 2092 收集水晶 Accept: 101 Submit: 439 Time Limit: 5000 mSec Memory Limit : 32768 KB Problem Desc ...

  9. POJ 2704 Pascal's Travels 【DFS记忆化搜索】

    题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Tota ...

随机推荐

  1. Luogu P4602 [CTSC2018]混合果汁

    题目 把果汁按美味度降序排序,以单价为下标插入主席树,记录每个节点的\(sum\)果汁升数和\(val\)果汁总价. 每次询问二分最小美味度,查询美味度大于等于\(mid\)的总体积为\(L\)的最低 ...

  2. pythonWeb框架创建app模块以及虚拟环境管理工具

    在进行项目搭建的时候,如果有多个功能模块,以及多个网页地址时,为了系统的可维护性,以及易读性,我们大多数情况下选择模块化开发 所以我们就要使用app指令来创建不同的功能模块 首先项目框架如下: 接下来 ...

  3. HNUSTOJ-1543 字符串的运算再现

    1543: 字符串的运算再现 时间限制: 1 Sec  内存限制: 128 MB提交: 34  解决: 7[提交][状态][讨论版] 题目描述 我们对字符串 S 做了以下定义:1. S ^ k表示由k ...

  4. zookeeper核心知识与投票机制详解

    Zookeeper数据模型与session机制:zookeeper的数据模型有点类似于文件夹的树状结构,每一个节点都叫做znode,每一个节点都可以有子节点和数据,就好像文件夹下面可以有文件和子文件夹 ...

  5. Homebrew学习(六)之替换及重置homebrew、Homebred Core、Homebrew cask默认源

    替换及重置homebrew默认源 中科大源 替换官方源: // 替换brew.git: cd "$(brew --repo)" git remote set-url origin ...

  6. python format格式化函数用法

    python format格式化函数用法 原文 Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前 ...

  7. HashMap的相关面试题

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...

  8. linux常用基本命令不全

    pwd 显示当前目录 ls -lh 显示文件列表,h表示会显示文件的大小 mkdir zhu  创建文件夹zhu rmdir zhu 移除文件夹zhu如果abc中含有其他文件,则不能删除 rm -r ...

  9. php 的windows集成开发环境

    1.安装视频  https://www.bilibili.com/video/av10274152/?p=5 2.所需的安装包: https://pan.baidu.com/s/1GLnuzkKFIT ...

  10. HDU-2389-Rain on your Parade (最大匹配,kopcroft-karp)

    链接: https://vjudge.net/problem/HDU-2389 题意: You're giving a party in the garden of your villa by the ...