Contest Setting 2018 ICPC Pacific Northwest Regional Contest dp

时间:2019-03-26
本文章向大家介绍Contest Setting 2018 ICPC Pacific Northwest Regional Contest dp,主要包括Contest Setting 2018 ICPC Pacific Northwest Regional Contest dp使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目:https://vj.69fa.cn/12703be72f729288b4cced17e2501850?v=1552995458

dp
这个题目网上说是dp+离散化
这个题目要对这些数字先处理然后进行dp,
这个处理值得学习一下,就是把数字范围为1~1e9,转化成一个顺序列表,这个顺序列表每一个不同的位置含有不同的难度,
dp[i][j]代表前面i种选出j种的方案数。

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod = 998244353;
const int maxn = 1010;
int a[maxn], b[maxn], c[maxn];
ll dp[maxn][maxn];

int main()
{
	int n, k;
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		b[i] = a[i];
	}
	memset(dp, 0, sizeof(dp));
	memset(c, 0, sizeof(c));
	sort(a + 1, a + 1 + n);
	int m = unique(a + 1, a + 1 + n) - (a + 1);
	for(int i=1;i<=n;i++)
	{
		b[i] = lower_bound(a + 1, a + 1 + m, b[i]) - a;
		c[b[i]]++;
	}
	for (int i = 0; i <= m; i++) dp[i][0] = 1;

	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=k;j++)
		{
			dp[i][j] = ((dp[i - 1][j - 1] * c[i]) % mod + dp[i - 1][j]) % mod;
		}
	}
	printf("%lld\n", dp[m][k]);
	return 0;
}