数据结构优化DP,树状数组+离散化

https://www.acwing.com/problem/content/299/
复制代码
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 1e3 + 5, mod = 1e9 + 7;
 5 
 6 int n, m;
 7 int a[N], f[N][N];
 8 int nums[N], cnt;
 9 int tr[N];
10 
11 int lowbit(int x) {
12     return x & -x;
13 }
14 
15 void add(int pos, int v) {
16     for (int i = pos; i <= cnt; i += lowbit(i)) tr[i] = (tr[i] + v) % mod;
17 }
18 
19 int sum(int x) {
20     int ans = 0;
21     for (int i = x; i; i -= lowbit(i)) ans = (ans + tr[i]) % mod;
22     return ans;
23 }
24 
25 int main() {
26     int T; cin >> T;
27     for (int C = 1; C <= T; C ++) {
28         cin >> n >> m;
29         cnt = 0;
30         for (int i = 1; i <= n; i ++) {
31             cin >> a[i];
32             nums[cnt ++] = a[i];
33         }
34         sort(nums, nums + cnt);
35         cnt = unique(nums, nums + cnt) - nums;
36         for (int i = 1; i <= n; i ++) a[i] = lower_bound(nums, nums + cnt, a[i]) - nums + 1;
37 
38         for (int i = 1; i <= n; i ++) f[i][1] = 1;
39         for (int j = 2; j <= m; j ++) {
40             for (int i = 1; i <= cnt; i ++) tr[i] = 0;
41             for (int i = 1; i <= n; i ++) {
42                 f[i][j] = sum(a[i] - 1);
43                 add(a[i], f[i][j - 1]);
44             }
45         }       
46 
47         int ans = 0;
48         for (int i = 1; i <= n; i ++) ans = (ans + f[i][m]) % mod;
49 
50         cout << "Case #" << C << ": " << ans << endl;
51     }
52     return 0;
53 }
复制代码

 

posted @   Leocsse  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示