Two Exams(ABC 238 F)

AtCoder - abc238_f

题目大意

n个人参加两场比赛,第i个人在第一场比赛中的排名是Pi,在第二场比赛中的排名是Qi,现在要求你选择k个人,要求被选择的人i没有被选择的人,满足Pi>PjQi>Qj,问有多少种选择的方法,答案对998244353取模。(1n300,1kn)

思路

这题记得寒假的时候还做过,还看过Solemntee大佬的博客,然后今天又做了一遍发现还是不会,悲。所以写一篇博客,希望下次遇到能秒。这题的话首先肯定能想到dp,我们先对P进行排序,就能消除P对答案的影响,然后再设dp[i][j][k]为前i个人,选择j个人,其中最小的没被选择的排名为k的方案数。然后考虑转移:

{dp[i][j+1][k]=dp[i][j+1][k]+dp[i1][j][k]if Qi<kdp[i][j][min(k,Qi)]=dp[i][j][min(k,Qi)]+dp[i1][j][k]i,j,k

然后这道题就做完啦

代码

#include<bits/stdc++.h>
using namespace std;
struct score
{
	int a,b;
	bool operator<(const score& s)const
	{
		return a<s.a;
	}
}a[305];
long long dp[305][305][305];
long long mod=998244353;
int main()
{
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)scanf("%d",&a[i].a);
	for(int i=1;i<=n;i++)scanf("%d",&a[i].b);
	sort(a+1,a+n+1);
	dp[0][0][n+1]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<i;j++)
		{
			for(int l=1;l<=n+1;l++)
			{
				if(a[i].b<l)dp[i][j+1][l]=(dp[i][j+1][l]+dp[i-1][j][l])%mod;
				dp[i][j][min(l,a[i].b)]=(dp[i][j][min(l,a[i].b)]+dp[i-1][j][l])%mod;
			}
		}
	}
	long long ans=0;
	for(int i=1;i<=n+1;i++)
	{
		ans=(ans+dp[n][k][i])%mod;
	}
	printf("%lld\n",ans);
	return 0;
}

__EOF__

本文作者Jerry-Black
本文链接https://www.cnblogs.com/Jerry-Black/p/16293957.html
关于博主:小蒟蒻一只( ̄^ ̄)ゞ
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
posted @   Jerry_Black  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示