[CSP-S模拟测试]:彩球问题(记忆化搜索)
题目传送门(内部题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模拟测试]:彩球问题(记忆化搜索)的更多相关文章
- HDU 3779 Railroad(记忆化搜索)
Railroad Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Subm ...
- [CSP-S模拟测试]:集合合并(记忆化搜索)
题目传送门(内部题133) 输入格式 第一行一个正整数$n$. 第二行$n$个正整数$a_i$,表示一开始有$S_i=\{a_i\}$ 输出格式 输出一个非负整数表示最大的收益之和 样例 样例输入: ...
- 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】
Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- HDU 4597 Play Game(记忆化搜索,深搜)
题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...
- HDU-1428(记忆化搜索)
Problem Description LL 最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU 校园呈方 ...
- ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)
链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...
- FZU 2092 收集水晶(记忆化搜索)
Problem 2092 收集水晶 Accept: 101 Submit: 439 Time Limit: 5000 mSec Memory Limit : 32768 KB Problem Desc ...
- POJ 2704 Pascal's Travels 【DFS记忆化搜索】
题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS Memory Limit: 65536K Tota ...
随机推荐
- Luogu P4602 [CTSC2018]混合果汁
题目 把果汁按美味度降序排序,以单价为下标插入主席树,记录每个节点的\(sum\)果汁升数和\(val\)果汁总价. 每次询问二分最小美味度,查询美味度大于等于\(mid\)的总体积为\(L\)的最低 ...
- pythonWeb框架创建app模块以及虚拟环境管理工具
在进行项目搭建的时候,如果有多个功能模块,以及多个网页地址时,为了系统的可维护性,以及易读性,我们大多数情况下选择模块化开发 所以我们就要使用app指令来创建不同的功能模块 首先项目框架如下: 接下来 ...
- HNUSTOJ-1543 字符串的运算再现
1543: 字符串的运算再现 时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 7[提交][状态][讨论版] 题目描述 我们对字符串 S 做了以下定义:1. S ^ k表示由k ...
- zookeeper核心知识与投票机制详解
Zookeeper数据模型与session机制:zookeeper的数据模型有点类似于文件夹的树状结构,每一个节点都叫做znode,每一个节点都可以有子节点和数据,就好像文件夹下面可以有文件和子文件夹 ...
- Homebrew学习(六)之替换及重置homebrew、Homebred Core、Homebrew cask默认源
替换及重置homebrew默认源 中科大源 替换官方源: // 替换brew.git: cd "$(brew --repo)" git remote set-url origin ...
- python format格式化函数用法
python format格式化函数用法 原文 Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前 ...
- HashMap的相关面试题
HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...
- linux常用基本命令不全
pwd 显示当前目录 ls -lh 显示文件列表,h表示会显示文件的大小 mkdir zhu 创建文件夹zhu rmdir zhu 移除文件夹zhu如果abc中含有其他文件,则不能删除 rm -r ...
- php 的windows集成开发环境
1.安装视频 https://www.bilibili.com/video/av10274152/?p=5 2.所需的安装包: https://pan.baidu.com/s/1GLnuzkKFIT ...
- 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 ...