序列立方

  • 直接做很难下手。考虑“出现次数的立方值”的组合意义,就是在原序列中选三个相同的子序列的方案数,然后DP即可
  • 利用容斥原理计算高维前缀和
  • 老生常谈的取模后运算得负数的问题
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
int a[255];
long long f[255][255][255],sum[255][255][255];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=1;k<=n;k++)
			{
				if(a[i]==a[j]&&a[j]==a[k])
				{
					f[i][j][k]=(sum[i-1][j-1][k-1]+1)%mod;
				}
				sum[i][j][k]=(sum[i-1][j][k]+sum[i][j-1][k]+sum[i][j][k-1]-sum[i-1][j-1][k]-sum[i-1][j][k-1]-sum[i][j-1][k-1]+sum[i-1][j-1][k-1]+f[i][j][k])%mod;
			}
		}
	}
	cout<<(sum[n][n][n]+mod)%mod<<endl;
	return 0;
}
posted @ 2024-07-19 20:25  D06  阅读(46)  评论(0编辑  收藏  举报