[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++

原文地址:https://www.cnblogs.com/wzc521/p/11747076.html

时间: 2024-10-04 03:57:43

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

HDU 3779 Railroad(记忆化搜索)

Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 10   Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description A train yard is a complex ser

hdu 1142(迪杰斯特拉+记忆化搜索)

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7330    Accepted Submission(s): 2687 Problem Description Jimmy experiences a lot of stress at work these days, especiall

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

3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] Description Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子 排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个: ·从某堆石子中取走一个 ·合并任意两堆石子 不能操作的人输.Alice想知道,她是否能有必胜策略. Input 第一行输入T

hdu 5098 Smart Software Installer 拓扑排序or记忆化搜索

Smart Software Installer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 416    Accepted Submission(s): 124 Problem Description The software installation is becoming more and more complex. An a

HDU3427 Clickomania【记忆化搜索】【区间DP】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3427 题目大意: Clickomania(彩球消除)是一款游戏,有几种颜色不同的方块排成一列.每次可以将一段连续的 颜色相同的方块消除掉,消除后原本这段方块两端的方块连接在一起,比如:ABBBA,将中间 的BBB消除后,就变成了AA.现在给你一段字符串,不同的字符代表不同的颜色,那么问题来 了:能不能将整个字符串消除完. 思路: 字符串的题目.本来感觉题目没有思路.无从下手,所幸题目中给了能够消除

记忆化搜索 hdu 1331

Function Run Fun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2586    Accepted Submission(s): 1255 Problem Description We all love recursion! Don't we? Consider a three-parameter recursive f

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

题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的分值.//解题思路:记忆化搜索,状态出来就非常水,dp[fl][fr][sl][sr][flag],//表示第一堆牌上边取到fl,下面取到fr,同样sl,sr为第二堆牌,flag为第几个人在取.//如果是第一个人,dp既要尽量大,如果是第二个人,那么肯定尽量小. http://www.2cto.co

wenbao与记忆化搜索

记忆化搜索: 通俗地讲就是搜索的形式,dp的思想 一些搜索难以完成,dp的动态转移方程又不好写的题,就会用到记忆化搜索,利用dp记录路径(相当于为dfs剪枝)用dfs进行模拟.. 啦啦啦啦啦啦,,,,,,,,,好厉害!!!!!! @ https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1059 弱鸡代码 1 #include <strin

POJ 1579 Function Run Fun 【记忆化搜索入门】

题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20560   Accepted: 10325 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <=