Contest Setting 2018 ICPC Pacific Northwest Regional Contest dp
题目:https://codeforces.com/gym/101982/attachments
Contest Setting
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; }