首页 > 其他分享 >序列划分(区间DP)

序列划分(区间DP)

时间:2024-08-22 17:08:16浏览次数:4  
标签:typedef return int 每组 long leq 划分 序列 DP

题目描述
\(n\)个人,每个人手上有一个数\(a_i\)。

将这些人分成若干组,组没有编号,要求每组人手上的数字之和都是质数。

求合法的分组方案数。
输入
第一行一个正整数\(T(1\leq T\leq 5)\),表示测试数据的组数。

每组数据第一行一个正整数\(n(1\leq n\leq 15)\)。

每组数据第二行\(n\)个正整数\(a_1,a_2,\dots,a_n(1\leq a_i\leq 100)\)。
输出
每组数据输出一行一个整数,即合法的分组方案数。
样例输入 Copy
1
3
3 2 5
样例输出 Copy
3

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}
const int N = 15;
int Lowbit[1<<N],Log2[1<<N],a[N],sum[1<<N];
ll f[1<<N];
bool st[2000];
void get_prime()
{ 
	st[0] = 0,st[1] = 0;
	for(int i=2;i<=2000;++i)
	{
	 	st[i] = 1;
	 	for(int j=2;j*j<=i;++j)
	 	{
	     	if(i%j==0) {st[i] = 0; break;}
	 	}
	}	
}
void solve()
{
	//对于集合S,设第一个被分出去的人i=lowbit(S),枚举含i的子集T
	//若T集合的和为质数则f[S]+=f[S-T]
	memset(f,0,sizeof f);
	f[0] = 1;
	int n;
	cin>>n;
	for(int i=0;i<n;++i) cin>>a[i];
	//需要预处理出每个状态的sum,否则会超时
	for(int i=0;i<(1<<n);++i)
	{
		int tmp = 0;
		for(int j=0;j<n;++j)
		{
			if(i>>j&1) tmp += a[j];
		}
		sum[i] = tmp;
	}
	for(int S=1;S<(1<<n);++S)
	{
		int i = Log2[Lowbit[S]];
		
		for(int T=S; T;T=(T-1)&S)
		{
			if(T>>i&1)
			{
				if(st[sum[T]]) f[S] += f[S-T];
			}
		}
	}
	cout<<f[(1<<n)-1]<<'\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	for(int i=0;i<(1<<N);++i) Lowbit[i] = lowbit(i);
	Log2[0] = -1;
	for(int i=1;i<(1<<N);++i) Log2[i] = Log2[i/2]+1;
	get_prime();
	int T;
	cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:typedef,return,int,每组,long,leq,划分,序列,DP
From: https://www.cnblogs.com/ruoye123456/p/18374307

相关文章

  • PHP反序列化一
    1.序列化/反序列化序列化:对象转化为字节流反序列化:字节流转化为对象二者相互结合,可以轻松的存储和传输数据,使程序更具维护性2.反序列化漏洞原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的......
  • 反序列化刷题(二)
    反序列化刷题web259(SSRF)1、explod(',',"hello,ju,hey"):把字符串以逗号为判断点分为若干个数组,hellojuhey2、array_pop($x):删除数组中的最后一个元素1、$_SERVER['HTTP_X_FORWARDED_FOR']用来获取数据包的IP地址;我们目标要ip=127.0.0.1;这里可以用x-forwarded-for:127.0.0.1......
  • [OI] 二项式期望 DP
    OSUOSUAnotherOSUyetAnotherOSUyetyetAnotherOSUOSU的题目是这样的:有一些相邻的块,给定每一个块的联通概率,每个连通块对答案有\(size^{3}\)的贡献,求总期望关于此题我曾写过题解此处此类题的关键之处在于,当我们设计了一个线性状态\(f_{i}\)之后,假如我们基于拼接......
  • Victor and World(状压DP)
    题目描述Aftertryinghardformanyyears,Victorhasfinallyreceivedapilotlicense.Tohaveacelebration,heintendstobuyhimselfanairplaneandflyaroundtheworld.Thereare\(n\)countriesontheearth,whicharenumberedfrom\(1\)to\(n\)......
  • 浅谈TCP和UDP协议的区别
    **传输模式**TCP协议:数据流(DataStream)--没有消息边界,比如服务端给客户端发来2048字节大小的数据,而客户端设置的一次最大接收大小为1024,这时候就意味着还有1024没能接收过来,要再接收一次。所以容易出现粘包的情况。所谓粘包,就是数据都粘在一起了。UDP协议:数据报(Da......
  • 网络编程UDP、TCP
    1UDP通信客户端UDPClientpublicclassUDPClient{publicstaticvoidmain(String[]args)throwsIOException{//获取本地服务器地址InetAddressserver_address=InetAddress.getLocalHost();//创建数据报套接字以连接到服务器......
  • [工具推荐]Hessian反序列化漏洞利用工具分享
    如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。免责声明本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉......
  • DP斜率优化学习笔记
    最后一次修改:2024.7.1614:39P.MBy哈哈铭简介“斜率优化”顾名思义就是用斜率进行优化,让\(DP\)的时间复杂度更优。一般情况下,将动态转移方程化简后得到这样的关系式:\[\frac{y_1-y_2}{x_1-x_2}\leqK\]然后通过该式进行转移,以达到优化时间复杂度的目的。小tip:推公式前......
  • 【内网渗透系列】域内权限划分
    域本地组成员范围:林中所有的用户、全局组、通用组、本域的域本地组。作用范围:本域。用途:给域内的资源设置访问权限。举例:test域有一台打印机P,test域中的用户A和B需要有访问权,新建域本地组DL,给域本地组DL赋予访问打印机P的权限,把用户A和B加到域本地组DL即可。全局组成员范围......
  • 1092. 最短公共超序列
    非常好的一道理解LCS本质的题目classSolution{public:stringlongestCommonSubsequence(conststringstr1,conststringstr2){intm=str1.length();intn=str2.length();//创建一个二维数组来存储LCS的长度vecto......