首页 > 其他分享 >Subsequence and Prefix Sum

Subsequence and Prefix Sum

时间:2024-10-15 21:43:56浏览次数:1  
标签:前缀 加入 int ll 个数 Prefix Subsequence Sum

Subsequence and Prefix Sum

\(n\) 才 \(100\),\(a_i\) 才 \(20\),显然 DP。

设 \(f_{i,j}\) 表示第 \(i\) 个数,前 \(i\) 个数前缀和为 \(j\) 的方案数。

显然,\(f_{0,0}=1\)。

留意到如果 \(j=0\),那么加入和不加入第 \(i\) 个数,最终的答案序列是一样的,因此此时加入第 \(i\) 个数对答案是没有贡献的,但是加入后会对之后的前缀和产生影响,会影响之后的序列。因此 \(f_i\) 不能统计答案,而 \(f_{i+1}\) 应该统计这种情况。

我们设 \(g_k\) 表示这种情况,也就是加入 \(k\) 后前缀和为 \(k\) 的方案数。

当 \(j\ne 0\) 时,\(f_{i,j+a_i}\) 不仅要统计前一位前缀和为 \(j\) 的方案数,还应统计之前某一位没有计入答案但是对前缀和产生影响的情况,即 \(g_j\)。

转移方程如下:

  • 第 \(i\) 个数不加入前缀和中:\(f_{i,j}\gets f_{i-1,j}\)
  • 第 \(i\) 个数加入前缀和中:\([j\ne 0]\ f_{i,j+a_i}\gets f_{i-1,j}+g_j\)
  • 枚举完 \(j\) 之后:\(g_{a_i}\gets f_{i-1,0}\)

答案即为 \(\sum_j f_{n,j}\)

因为值有负数,所以下标需要调整,注意细节。

综上,时间复杂度 \(O(n^2V)\)。

Code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
using namespace std;
typedef long long ll;
const int N=101,mod=1e9+7,M=1001;
int n,a[N],b[N];
ll dp[N][2010];
ll g[2010];
void add(ll &a,ll b){
	a=(a+b)%mod;
}
int main(){
	sf("%d",&n);
	for(int i=1;i<=n;i++){
		sf("%d",&a[i]);
		b[i]=b[i-1]+a[i];
	}
	dp[0][M]=1;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=M<<1;j++){
			add(dp[i][j],dp[i-1][j]);
			if(j!=M){
				add(dp[i][j+a[i]],dp[i-1][j]+g[j]);
			}
		}
		g[a[i]+M]=dp[i-1][M];
	}
	ll ans=0;
	for(int i=0;i<=M<<1;i++) add(ans,dp[n][i]);
	pf("%lld\n",ans);
}

标签:前缀,加入,int,ll,个数,Prefix,Subsequence,Sum
From: https://www.cnblogs.com/liyixin0514/p/18468559

相关文章

  • Balanced Subsequences
    BalancedSubsequences注意子序列不一定连续。恰好最长合法括号子序列长度为\(2k\),那么废掉的)个数为\(m-k\)。恰好的方案数\(f_k\)不好求,我们可以求\(g_k\)表示长度至少为\(2k\)的方案数。(表示向上走,)表示向下走,\(g_k\)即为从\((0,0)\)走到\((n+m,n-m)\),且......
  • Natasha, Sasha and the Prefix Sums
    Natasha,SashaandthePrefixSums设\(g(x)\)表示\(f(a)=x\)的个数,那么\(ans=\sum_{x=\max(0,n-m)}^{n}xg_x\)。恰好不好求,我们求\(h(x)\)表示\(f(a)\lex\)的个数,\(g(x)=h(x)-h(x-1)\)。1表示向上走,-1表示向下走,\(h_i\)就是求从\((0,0)\)走到\((n+m,n-m)\)......
  • [ARC163D] Sum of SCC
    神秘trick题。根本想不到的Trick:一个竞赛图的强连通分量的个数等价于:把整个图分成两个集合\(S,T\),\(u\inS,v\inT\),满足所有边的方向为\(u\tov\)。为什么是对的呢?考虑到把整个图缩点以后就是一个DAG,而且还是一个竞赛图,然后竞赛图的拓扑序是唯一的,找到一个拓补序的分......
  • Solution - Codeforces 1628D2 Game on Sum (Hard Version)
    首先来考虑Easy。注意到的是最后输出的答案要求是模意义下的,这说明对于实数二分的做法都已经用不了了。注意到\(n,m\le3000\)的数据范围,于是一个想法就是考虑DP之类的算法。考虑到B选了\(+/-\)实际上就代表着下一轮的\(m\)是否会\(-1\),于是可以设状态为\(f_{i......
  • 洛谷题单指南-字符串-P1470 [USACO2.3] 最长前缀 Longest Prefix
    原题链接:https://www.luogu.com.cn/problem/P1470题意解读:求s最长前缀长度,使得可以拆解成p集合中的字符串解题思路:动态规划:设s字符串下标从1开始,p集合用set<string>保存所有的元素状态表示:设f[i]表示前i个字符s[0~i-1]是否能拆解成p中的元素状态计算:对于j=i-1开始往后倒......
  • 基于Python的自然语言处理系列(26):Get to the Point Summarization
            在本篇文章中,我们将实现经典的"GettothePoint"模型,该模型最初发表于GettothePoint:SummarizationwithPointer-GeneratorNetworks。这是当时最著名的摘要生成模型之一,至今仍有很多人使用其Pointer-Generator架构作为他们模型的一部分。1.模型简介......
  • Walter Russell's 'The Universal One' - Detailed Summary
    1.宇宙统一理论Russell试图提出一个全面的理论来解释宇宙的所有方面。他认为:所有自然现象,无论是物质的、能量的还是精神的,都遵循相同的基本原理。宇宙是一个统一的、有机的整体,其中所有部分都相互关联和相互依存。他的理论试图涵盖从原子结构到星系形成,从生命起源到意......
  • 【原创】ns3 + sumo + ns3gym编译冲突解决方案
    Copyright(c)2024,China,HenanUnivercityofScienceandTechnology河南科技大学,中国在搞ndnSIM当毕业设计,ns3+ndnsim+sumo+ns3-gym编译存在冲突:from../contrib/ndn4ivc/apps/fgfxf-rsu.cc:25:./ns3/sumo-TraCIConstants.h:328:21:error:exp......
  • python——celery异常consumer: Cannot connect to redis://127.0.0.1:6379/1: MISCON
    1.检查Redis日志:查看Redis的日志文件(通常位于/var/log/redis/redis-server.log或者根据你的配置文件中指定的位置),以获取有关错误原因的详细信息。2.检查磁盘空间:确保你的服务器有足够的磁盘空间。使用以下命令检查磁盘使用情况:bashdf-h如果磁盘空间不足,清理一些不必......
  • abc351F Double Sum
    给定数组A[N],对所有1<=i<j<=N,计算max(A[j]-A[i],0)之和。2<=N<=4E5;0<=A[i]<=1E8分析:从左到后依次处理,用平衡树维护左侧A[i],对于A[j],只需要统计值小于A[j]的那些A[i]即可,可以合并求和过程转化为前缀和。#include<bits/stdc++.h>usingi64=longlong;template<typename......