• Educational Codeforces Round 46 (Rated for Div. 2) D


    dp[i]表示一定包含第I个点的好的子序列个数,那么最终答案就是求dp[0] + dp[1] + .... + dp[n-1]

    最终的子序列被分成了很多块,因此很明显我们枚举第一块,第一块和剩下的再去组合,然后我们为了保证没有重复,我们需要保证第一块不同,然而第一块的大小是固定的,因此我们可以选择枚举第一块最后一个数,这样第一块就肯定不会相同了,也可以计算

    const ll P = 998244353;
    
    ll dp[maxn];
    
    int N = 1000;
    
    ll comb[maxn][maxn];
    
    int main(){
    	for(int i=0;i<=N;i++)
    		comb[i][0]=comb[i][i]=1;
    	for(int i=2;i<=N;i++)
    		for(int j=1;j<N;j++)
    			comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%P;
    	int n;
    	cin >> n;
    	vector<int> a(n);
    	for(int i = 0 ; i < n ; i++) {
    		cin >> a[i];
    	}	
    	dp[n]=1;
    	ll ans=0;
    	for(int i = n - 1 ; i >= 0 ; i--){
    		if(a[i] <= 0 ) continue;
    		ll sum = 0;
    		for(int j = n ; j >= i + a[i] + 1 ; j--){
    			sum = (sum + dp[j]) % P;
    			dp[i] = (dp[i] + comb[j - i - 2][a[i] -1] % P * sum % P) % P;
    		}
    		//cout<<dp[i]<<endl;
    		//cout<<ans<<endl;
    		ans= (ans+dp[i]) %P;
    	}
    	cout<<ans<<endl;
    	return 0;
    } 
    

      

  • 相关阅读:
    SQL逻辑查询语句执行顺序
    数据库索引的实现原理
    JAVAMail邮件服务器
    TCP/IP基础
    Java IO流学习总结
    [Lydsy1806月赛] 超速摄像头
    CodeForces
    SCU
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/033000-/p/12322668.html
Copyright © 2020-2023  润新知